Skip to content

Commit 2a20dfa

Browse files
mejrsJonathanBrouwer
authored andcommitted
move SanitizerSet
1 parent 589bb91 commit 2a20dfa

12 files changed

Lines changed: 184 additions & 152 deletions

File tree

‎Cargo.lock‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3665,7 +3665,6 @@ dependencies = [
36653665
"rustc_serialize",
36663666
"rustc_span",
36673667
"rustc_structures",
3668-
"rustc_target",
36693668
"smallvec",
36703669
"thin-vec",
36713670
"tracing",
@@ -3787,6 +3786,7 @@ dependencies = [
37873786
"rustc_sanitizers",
37883787
"rustc_session",
37893788
"rustc_span",
3789+
"rustc_structures",
37903790
"rustc_symbol_mangling",
37913791
"rustc_target",
37923792
"smallvec",
@@ -4786,9 +4786,12 @@ dependencies = [
47864786
name = "rustc_structures"
47874787
version = "0.0.0"
47884788
dependencies = [
4789+
"bitflags",
47894790
"rustc_data_structures",
47904791
"rustc_macros",
47914792
"rustc_serialize",
4793+
"schemars",
4794+
"serde",
47924795
]
47934796

47944797
[[package]]
@@ -4821,6 +4824,7 @@ dependencies = [
48214824
"rustc_macros",
48224825
"rustc_serialize",
48234826
"rustc_span",
4827+
"rustc_structures",
48244828
"schemars",
48254829
"serde",
48264830
"serde_derive",

‎compiler/rustc_attr_ir/Cargo.toml‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ rustc_macros = { path = "../rustc_macros" }
1414
rustc_serialize = { path = "../rustc_serialize" }
1515
rustc_span = { path = "../rustc_span" }
1616
rustc_structures = { path = "../rustc_structures" }
17-
rustc_target = { path = "../rustc_target" }
1817
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
1918
thin-vec = "0.2.18"
2019
tracing = "0.1"

‎compiler/rustc_attr_ir/src/data_structures.rs‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ use rustc_macros::{Decodable, Encodable, PrintAttribute, StableHash};
1616
use rustc_span::def_id::DefId;
1717
use rustc_span::hygiene::Transparency;
1818
use rustc_span::{ErrorGuaranteed, Ident, Span, Symbol};
19-
use rustc_structures::Limit;
20-
pub use rustc_target::spec::SanitizerSet;
19+
use rustc_structures::{Limit, SanitizerSet};
2120
use thin_vec::ThinVec;
2221

2322
pub use crate::canonical_symbols::{CanonicalSymbol, CanonicalSymbols};

‎compiler/rustc_attr_ir/src/pretty_printing.rs‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ use rustc_data_structures::fx::FxIndexMap;
1414
use rustc_span::def_id::DefId;
1515
use rustc_span::hygiene::Transparency;
1616
use rustc_span::{ErrorGuaranteed, Ident, Span, Symbol};
17-
use rustc_structures::Limit;
18-
use rustc_target::spec::SanitizerSet;
17+
use rustc_structures::{Limit, SanitizerSet};
1918
use thin_vec::ThinVec;
2019

2120
/// This trait is used to print attributes in `rustc_hir_pretty`.

‎compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use rustc_attr_ir::{
2-
CoverageAttrKind, InstrumentFnAttr, OptimizeAttr, RtsanSetting, SanitizerSet, UsedBy, find_attr,
2+
CoverageAttrKind, InstrumentFnAttr, OptimizeAttr, RtsanSetting, UsedBy, find_attr,
33
};
44
use rustc_feature::AttributeStability;
55
use rustc_session::diagnostics::feature_err;
66
use rustc_span::edition::Edition::Edition2024;
7+
use rustc_structures::SanitizerSet;
78

89
use super::prelude::*;
910
use crate::attributes::AttributeSafety;

‎compiler/rustc_codegen_llvm/Cargo.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ rustc_middle = { path = "../rustc_middle" }
3636
rustc_sanitizers = { path = "../rustc_sanitizers" }
3737
rustc_session = { path = "../rustc_session" }
3838
rustc_span = { path = "../rustc_span" }
39+
rustc_structures = { path = "../rustc_structures" }
3940
rustc_symbol_mangling = { path = "../rustc_symbol_mangling" }
4041
rustc_target = { path = "../rustc_target" }
4142
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }

‎compiler/rustc_codegen_llvm/src/back/lto.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ use rustc_data_structures::fx::FxHashMap;
1818
use rustc_data_structures::memmap::Mmap;
1919
use rustc_data_structures::profiling::SelfProfilerRef;
2020
use rustc_errors::{DiagCtxt, DiagCtxtHandle};
21-
use rustc_hir::attrs::SanitizerSet;
2221
use rustc_middle::bug;
2322
use rustc_middle::dep_graph::WorkProduct;
2423
use rustc_session::config;
24+
use rustc_structures::SanitizerSet;
2525
use tracing::{debug, info};
2626

2727
use crate::back::write::{

‎compiler/rustc_structures/Cargo.toml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ edition = "2024"
55

66
[dependencies]
77
# tidy-alphabetical-start
8+
bitflags = "2.4.1"
89
rustc_data_structures = { path = "../rustc_data_structures" }
910
rustc_macros = { path = "../rustc_macros" }
1011
rustc_serialize = { path = "../rustc_serialize" }
12+
schemars = "1.0.4"
13+
serde = "1.0.219"
1114
# tidy-alphabetical-end
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
mod limit;
2+
mod sanitizer_set;
23

34
pub use limit::Limit;
5+
pub use sanitizer_set::SanitizerSet;
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
use core::fmt;
2+
use std::str::FromStr;
3+
4+
use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash};
5+
6+
#[derive(
7+
Default,
8+
Clone,
9+
Copy,
10+
PartialEq,
11+
Eq,
12+
Hash,
13+
Encodable_NoContext,
14+
Decodable_NoContext,
15+
StableHash
16+
)]
17+
pub struct SanitizerSet(u16);
18+
bitflags::bitflags! {
19+
impl SanitizerSet: u16 {
20+
const ADDRESS = 1 << 0;
21+
const LEAK = 1 << 1;
22+
const MEMORY = 1 << 2;
23+
const THREAD = 1 << 3;
24+
const HWADDRESS = 1 << 4;
25+
const CFI = 1 << 5;
26+
const MEMTAG = 1 << 6;
27+
const SHADOWCALLSTACK = 1 << 7;
28+
const KCFI = 1 << 8;
29+
const KERNELADDRESS = 1 << 9;
30+
const KERNELHWADDRESS = 1 << 10;
31+
const SAFESTACK = 1 << 11;
32+
const DATAFLOW = 1 << 12;
33+
const REALTIME = 1 << 13;
34+
}
35+
}
36+
rustc_data_structures::external_bitflags_debug! { SanitizerSet }
37+
38+
impl SanitizerSet {
39+
// Taken from LLVM's sanitizer compatibility logic:
40+
// https://github.com/llvm/llvm-project/blob/release/18.x/clang/lib/Driver/SanitizerArgs.cpp#L512
41+
const MUTUALLY_EXCLUSIVE: &'static [(SanitizerSet, SanitizerSet)] = &[
42+
(SanitizerSet::ADDRESS, SanitizerSet::MEMORY),
43+
(SanitizerSet::ADDRESS, SanitizerSet::THREAD),
44+
(SanitizerSet::ADDRESS, SanitizerSet::HWADDRESS),
45+
(SanitizerSet::ADDRESS, SanitizerSet::MEMTAG),
46+
(SanitizerSet::ADDRESS, SanitizerSet::KERNELADDRESS),
47+
(SanitizerSet::ADDRESS, SanitizerSet::KERNELHWADDRESS),
48+
(SanitizerSet::ADDRESS, SanitizerSet::SAFESTACK),
49+
(SanitizerSet::LEAK, SanitizerSet::MEMORY),
50+
(SanitizerSet::LEAK, SanitizerSet::THREAD),
51+
(SanitizerSet::LEAK, SanitizerSet::KERNELADDRESS),
52+
(SanitizerSet::LEAK, SanitizerSet::KERNELHWADDRESS),
53+
(SanitizerSet::LEAK, SanitizerSet::SAFESTACK),
54+
(SanitizerSet::MEMORY, SanitizerSet::THREAD),
55+
(SanitizerSet::MEMORY, SanitizerSet::HWADDRESS),
56+
(SanitizerSet::MEMORY, SanitizerSet::KERNELADDRESS),
57+
(SanitizerSet::MEMORY, SanitizerSet::KERNELHWADDRESS),
58+
(SanitizerSet::MEMORY, SanitizerSet::SAFESTACK),
59+
(SanitizerSet::THREAD, SanitizerSet::HWADDRESS),
60+
(SanitizerSet::THREAD, SanitizerSet::KERNELADDRESS),
61+
(SanitizerSet::THREAD, SanitizerSet::KERNELHWADDRESS),
62+
(SanitizerSet::THREAD, SanitizerSet::SAFESTACK),
63+
(SanitizerSet::HWADDRESS, SanitizerSet::MEMTAG),
64+
(SanitizerSet::HWADDRESS, SanitizerSet::KERNELADDRESS),
65+
(SanitizerSet::HWADDRESS, SanitizerSet::KERNELHWADDRESS),
66+
(SanitizerSet::HWADDRESS, SanitizerSet::SAFESTACK),
67+
(SanitizerSet::CFI, SanitizerSet::KCFI),
68+
(SanitizerSet::MEMTAG, SanitizerSet::KERNELADDRESS),
69+
(SanitizerSet::MEMTAG, SanitizerSet::KERNELHWADDRESS),
70+
(SanitizerSet::KERNELADDRESS, SanitizerSet::KERNELHWADDRESS),
71+
(SanitizerSet::KERNELADDRESS, SanitizerSet::SAFESTACK),
72+
(SanitizerSet::KERNELHWADDRESS, SanitizerSet::SAFESTACK),
73+
];
74+
75+
/// Return sanitizer's name
76+
///
77+
/// Returns none if the flags is a set of sanitizers numbering not exactly one.
78+
pub fn as_str(self) -> Option<&'static str> {
79+
Some(match self {
80+
SanitizerSet::ADDRESS => "address",
81+
SanitizerSet::CFI => "cfi",
82+
SanitizerSet::DATAFLOW => "dataflow",
83+
SanitizerSet::KCFI => "kcfi",
84+
SanitizerSet::KERNELADDRESS => "kernel-address",
85+
SanitizerSet::KERNELHWADDRESS => "kernel-hwaddress",
86+
SanitizerSet::LEAK => "leak",
87+
SanitizerSet::MEMORY => "memory",
88+
SanitizerSet::MEMTAG => "memtag",
89+
SanitizerSet::SAFESTACK => "safestack",
90+
SanitizerSet::SHADOWCALLSTACK => "shadow-call-stack",
91+
SanitizerSet::THREAD => "thread",
92+
SanitizerSet::HWADDRESS => "hwaddress",
93+
SanitizerSet::REALTIME => "realtime",
94+
_ => return None,
95+
})
96+
}
97+
98+
pub fn mutually_exclusive(self) -> Option<(SanitizerSet, SanitizerSet)> {
99+
Self::MUTUALLY_EXCLUSIVE
100+
.into_iter()
101+
.find(|&(a, b)| self.contains(*a) && self.contains(*b))
102+
.copied()
103+
}
104+
}
105+
106+
/// Formats a sanitizer set as a comma separated list of sanitizers' names.
107+
impl fmt::Display for SanitizerSet {
108+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109+
let mut first = true;
110+
for s in *self {
111+
let name = s.as_str().unwrap_or_else(|| panic!("unrecognized sanitizer {s:?}"));
112+
if !first {
113+
f.write_str(", ")?;
114+
}
115+
f.write_str(name)?;
116+
first = false;
117+
}
118+
Ok(())
119+
}
120+
}
121+
122+
impl FromStr for SanitizerSet {
123+
type Err = String;
124+
fn from_str(s: &str) -> Result<Self, Self::Err> {
125+
Ok(match s {
126+
"address" => SanitizerSet::ADDRESS,
127+
"cfi" => SanitizerSet::CFI,
128+
"dataflow" => SanitizerSet::DATAFLOW,
129+
"kcfi" => SanitizerSet::KCFI,
130+
"kernel-address" => SanitizerSet::KERNELADDRESS,
131+
"kernel-hwaddress" => SanitizerSet::KERNELHWADDRESS,
132+
"leak" => SanitizerSet::LEAK,
133+
"memory" => SanitizerSet::MEMORY,
134+
"memtag" => SanitizerSet::MEMTAG,
135+
"safestack" => SanitizerSet::SAFESTACK,
136+
"shadow-call-stack" => SanitizerSet::SHADOWCALLSTACK,
137+
"thread" => SanitizerSet::THREAD,
138+
"hwaddress" => SanitizerSet::HWADDRESS,
139+
"realtime" => SanitizerSet::REALTIME,
140+
s => return Err(format!("unknown sanitizer {s}")),
141+
})
142+
}
143+
}
144+
145+
impl schemars::JsonSchema for SanitizerSet {
146+
fn schema_name() -> std::borrow::Cow<'static, str> {
147+
"SanitizerSet".into()
148+
}
149+
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
150+
let all = Self::all().iter().map(|sanitizer| sanitizer.as_str()).collect::<Vec<_>>();
151+
schemars::json_schema! ({
152+
"type": "string",
153+
"enum": all,
154+
})
155+
}
156+
}
157+
158+
impl<'de> serde::Deserialize<'de> for SanitizerSet {
159+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
160+
where
161+
D: serde::Deserializer<'de>,
162+
{
163+
let s = String::deserialize(deserializer)?;
164+
FromStr::from_str(&s).map_err(serde::de::Error::custom)
165+
}
166+
}

0 commit comments

Comments
 (0)