https://github.com/skc7 updated https://github.com/llvm/llvm-project/pull/70166
>From dcb104a61666e75b4b21b7a119524c32b22262b8 Mon Sep 17 00:00:00 2001 From: skc7 <krishna.sank...@amd.com> Date: Wed, 25 Oct 2023 10:46:10 +0530 Subject: [PATCH] [ASAN] For Asan instrumented globals, emit two symbols, with actual size and instrumented size. --- clang/test/CodeGen/asan_globals_symbols.cpp | 15 ++++++++++ llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 28 ++++++++++++++++++- .../Instrumentation/AddressSanitizer.cpp | 3 ++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGen/asan_globals_symbols.cpp diff --git a/clang/test/CodeGen/asan_globals_symbols.cpp b/clang/test/CodeGen/asan_globals_symbols.cpp new file mode 100644 index 000000000000000..d53afb2433b1715 --- /dev/null +++ b/clang/test/CodeGen/asan_globals_symbols.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -S -x c++ -std=c++11 -triple x86_64-linux \ +// RUN: -fsanitize=address -o %t.out %s +// RUN: FileCheck %s --input-file=%t.out --check-prefix=CHECK-A + +// CHECK-A: myGlobal: +// CHECK-A: .size myGlobal, 4 +// CHECK-A: myGlobal__sanitized_padded_global: +// CHECK-A .size myGlobal__sanitized_padded_global, 32 + +int myGlobal; + +int main() { + myGlobal = 0; + return 0; +} diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 15ff39883680369..49821be73716a2a 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -766,6 +766,19 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable *GV) { // sections and expected to be contiguous (e.g. ObjC metadata). const Align Alignment = getGVAlignment(GV, DL); + // Identify globals with "SanitizedPaddedGlobal" attribute and extract + // the actual global variable size. + uint64_t ActualSize = 0; + if (GV->hasAttribute(Attribute::SanitizedPaddedGlobal)) { + StructType *ST = dyn_cast<StructType>(GV->getValueType()); + if (ST && ST->getNumElements() == 2) { + auto *ET0 = ST->getElementType(0); + if (ET0 && isa<ArrayType>(ST->getElementType(1))) { + ActualSize = DL.getTypeAllocSize(ET0); + } + } + } + for (const HandlerInfo &HI : Handlers) { NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName, HI.TimerGroupDescription, @@ -876,6 +889,18 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable *GV) { MCSymbol *EmittedInitSym = GVSym; + if (GV->hasAttribute(Attribute::SanitizedPaddedGlobal)) { + OutStreamer->switchSection(TheSection); + emitLinkage(GV, EmittedInitSym); + OutStreamer->emitLabel(EmittedInitSym); + if (MAI->hasDotTypeDotSizeDirective()) + OutStreamer->emitELFSize(EmittedInitSym, + MCConstantExpr::create(ActualSize, OutContext)); + EmittedInitSym = OutContext.getOrCreateSymbol( + GVSym->getName() + Twine("__sanitized_padded_global")); + emitVisibility(EmittedInitSym, GV->getVisibility(), !GV->isDeclaration()); + } + OutStreamer->switchSection(TheSection); emitLinkage(GV, EmittedInitSym); @@ -883,7 +908,8 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable *GV) { OutStreamer->emitLabel(EmittedInitSym); MCSymbol *LocalAlias = getSymbolPreferLocal(*GV); - if (LocalAlias != EmittedInitSym) + if ((LocalAlias != EmittedInitSym) && + !GV->hasAttribute(Attribute::SanitizedPaddedGlobal)) OutStreamer->emitLabel(LocalAlias); emitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer()); diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index da157c966bfcbed..172794dd3303c06 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -2456,6 +2456,9 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, Module &M, // zero so we can copy the metadata over as is. NewGlobal->copyMetadata(G, 0); + // Attach "SanitizedPaddedGlobal" attribute to the new global. + NewGlobal->addAttribute(Attribute::SanitizedPaddedGlobal); + Value *Indices2[2]; Indices2[0] = IRB.getInt32(0); Indices2[1] = IRB.getInt32(0); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits