[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:
Evgenii Stepanov 2021-06-22 16:27:11 -07:00
parent 660cae84c3
commit 78f7e6d8d7
2 changed files with 33 additions and 0 deletions

View File

@ -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;

View File

@ -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}