forked from OSchip/llvm-project
[hwasan] Respect llvm.asan.globals.
This enable no_sanitize C++ attribute to exclude globals from hwasan testing, and automatically excludes other sanitizers' globals (such as ubsan location descriptors). Differential Revision: https://reviews.llvm.org/D104825
This commit is contained in:
parent
660cae84c3
commit
78f7e6d8d7
|
@ -1467,9 +1467,36 @@ void HWAddressSanitizer::instrumentGlobal(GlobalVariable *GV, uint8_t Tag) {
|
|||
GV->eraseFromParent();
|
||||
}
|
||||
|
||||
static DenseSet<GlobalVariable *> getExcludedGlobals(Module &M) {
|
||||
NamedMDNode *Globals = M.getNamedMetadata("llvm.asan.globals");
|
||||
if (!Globals)
|
||||
return DenseSet<GlobalVariable *>();
|
||||
DenseSet<GlobalVariable *> Excluded(Globals->getNumOperands());
|
||||
for (auto MDN : Globals->operands()) {
|
||||
// Metadata node contains the global and the fields of "Entry".
|
||||
assert(MDN->getNumOperands() == 5);
|
||||
auto *V = mdconst::extract_or_null<Constant>(MDN->getOperand(0));
|
||||
// The optimizer may optimize away a global entirely.
|
||||
if (!V)
|
||||
continue;
|
||||
auto *StrippedV = V->stripPointerCasts();
|
||||
auto *GV = dyn_cast<GlobalVariable>(StrippedV);
|
||||
if (!GV)
|
||||
continue;
|
||||
ConstantInt *IsExcluded = mdconst::extract<ConstantInt>(MDN->getOperand(4));
|
||||
if (IsExcluded->isOne())
|
||||
Excluded.insert(GV);
|
||||
}
|
||||
return Excluded;
|
||||
}
|
||||
|
||||
void HWAddressSanitizer::instrumentGlobals() {
|
||||
std::vector<GlobalVariable *> Globals;
|
||||
auto ExcludedGlobals = getExcludedGlobals(M);
|
||||
for (GlobalVariable &GV : M.globals()) {
|
||||
if (ExcludedGlobals.count(&GV))
|
||||
continue;
|
||||
|
||||
if (GV.isDeclarationForLinker() || GV.getName().startswith("llvm.") ||
|
||||
GV.isThreadLocal())
|
||||
continue;
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
; CHECK29: @four = global
|
||||
|
||||
; CHECK: @specialcaselisted = global i16 2
|
||||
|
||||
; CHECK: @__start_hwasan_globals = external hidden constant [0 x i8]
|
||||
; CHECK: @__stop_hwasan_globals = external hidden constant [0 x i8]
|
||||
|
||||
|
@ -34,3 +36,7 @@ source_filename = "foo"
|
|||
@four = global i32 1
|
||||
@sixteen = global [16 x i8] zeroinitializer
|
||||
@huge = global [16777232 x i8] zeroinitializer
|
||||
@specialcaselisted = global i16 2
|
||||
|
||||
!llvm.asan.globals = !{!0}
|
||||
!0 = !{i16* @specialcaselisted, null, null, i1 false, i1 true}
|
||||
|
|
Loading…
Reference in New Issue