compiler_llvm_builder/
sanitizer.rs

1//!
2//! LLVM sanitizers.
3//!
4
5///
6/// LLVM sanitizers.
7///
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub enum Sanitizer {
10    /// The address sanitizer.
11    Address,
12    /// The memory sanitizer.
13    Memory,
14    /// The memory with origins sanitizer.
15    MemoryWithOrigins,
16    /// The undefined behavior sanitizer
17    Undefined,
18    /// The thread sanitizer.
19    Thread,
20    /// The data flow sanitizer.
21    DataFlow,
22    /// Combine address and undefined behavior sanitizer.
23    AddressUndefined,
24}
25
26impl std::str::FromStr for Sanitizer {
27    type Err = String;
28    fn from_str(value: &str) -> Result<Self, Self::Err> {
29        match value.to_lowercase().as_str() {
30            "address" => Ok(Self::Address),
31            "memory" => Ok(Self::Memory),
32            "memorywithorigins" => Ok(Self::MemoryWithOrigins),
33            "undefined" => Ok(Self::Undefined),
34            "thread" => Ok(Self::Thread),
35            "dataflow" => Ok(Self::DataFlow),
36            "address;undefined" => Ok(Self::AddressUndefined),
37            value => Err(format!("Unsupported sanitizer: `{}`", value)),
38        }
39    }
40}
41
42impl std::fmt::Display for Sanitizer {
43    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
44        match self {
45            Self::Address => write!(f, "Address"),
46            Self::Memory => write!(f, "Memory"),
47            Self::MemoryWithOrigins => write!(f, "MemoryWithOrigins"),
48            Self::Undefined => write!(f, "Undefined"),
49            Self::Thread => write!(f, "Thread"),
50            Self::DataFlow => write!(f, "DataFlow"),
51            Self::AddressUndefined => write!(f, "Address;Undefined"),
52        }
53    }
54}