[llvm] [clang] [ASAN] For Asan instrumented global, emit two symbols, one with actual size and other with instrumented size. (PR #70166)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 1 01:15:18 PST 2023
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.Sankisa at 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);
More information about the cfe-commits
mailing list