[clang] [WIP] For Asan instrumented global, emit two symbols, one with actual size and other with instrumented size. (PR #70166)

2023-10-25 Thread via cfe-commits

https://github.com/skc7 edited https://github.com/llvm/llvm-project/pull/70166
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [WIP] For Asan instrumented global, emit two symbols, one with actual size and other with instrumented size. (PR #70166)

2023-10-24 Thread Vitaly Buka via cfe-commits

vitalybuka wrote:

Would it be possible to create an issue, or RFC explain in one place what it 
the problem you are trying to solve and how?

https://github.com/llvm/llvm-project/pull/70166
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [WIP] For Asan instrumented global, emit two symbols, one with actual size and other with instrumented size. (PR #70166)

2023-10-24 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Chaitanya (skc7)


Changes

This PR has dependency on #68865

---
Full diff: https://github.com/llvm/llvm-project/pull/70166.diff


3 Files Affected:

- (added) clang/test/CodeGen/asan_globals_symbols.cpp (+15) 
- (modified) llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (+27-1) 
- (modified) llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp (+3) 


``diff
diff --git a/clang/test/CodeGen/asan_globals_symbols.cpp 
b/clang/test/CodeGen/asan_globals_symbols.cpp
new file mode 100644
index 000..09e35506bd8e186
--- /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__asan_instrumented:
+// CHECK-A  .size   myGlobal__asan_instrumented, 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 072c55f79caa9dc..d71ee82ce6ca628 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -758,6 +758,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 "asan_instrumented" attribute and extract
+  // the actual global variable size.
+  uint64_t ActualSize = 0;
+  if (GV->hasAttribute(Attribute::SanitizeAddress)) {
+StructType *ST = dyn_cast(GV->getValueType());
+if (ST && ST->getNumElements() == 2) {
+  auto *ET0 = ST->getElementType(0);
+  if (ET0 && isa(ST->getElementType(1))) {
+ActualSize = DL.getTypeAllocSize(ET0);
+  }
+}
+  }
+
   for (const HandlerInfo  : Handlers) {
 NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
HI.TimerGroupName, HI.TimerGroupDescription,
@@ -868,6 +881,18 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable 
*GV) {
 
   MCSymbol *EmittedInitSym = GVSym;
 
+  if (GV->hasAttribute(Attribute::SanitizeAddress)) {
+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("__asan_instrumented"));
+emitVisibility(EmittedInitSym, GV->getVisibility(), !GV->isDeclaration());
+  }
+
   OutStreamer->switchSection(TheSection);
 
   emitLinkage(GV, EmittedInitSym);
@@ -875,7 +900,8 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable 
*GV) {
 
   OutStreamer->emitLabel(EmittedInitSym);
   MCSymbol *LocalAlias = getSymbolPreferLocal(*GV);
-  if (LocalAlias != EmittedInitSym)
+  if ((LocalAlias != EmittedInitSym) &&
+  !GV->hasAttribute(Attribute::SanitizeAddress))
 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 e80ee1953de6b21..c5ef705d8ca9e30 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2441,6 +2441,9 @@ void 
ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> , Module ,
 // zero so we can copy the metadata over as is.
 NewGlobal->copyMetadata(G, 0);
 
+// Attach "asan_instrumented" attribute to the new global.
+NewGlobal->addAttribute(Attribute::SanitizeAddress);
+
 Value *Indices2[2];
 Indices2[0] = IRB.getInt32(0);
 Indices2[1] = IRB.getInt32(0);

``




https://github.com/llvm/llvm-project/pull/70166
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [WIP] For Asan instrumented global, emit two symbols, one with actual size and other with instrumented size. (PR #70166)

2023-10-24 Thread via cfe-commits

https://github.com/skc7 created https://github.com/llvm/llvm-project/pull/70166

This PR has dependency on #68865

>From d6f66a73e6ae7684411c246cb3e82a4ab214c0d1 Mon Sep 17 00:00:00 2001
From: skc7 
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 000..09e35506bd8e186
--- /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__asan_instrumented:
+// CHECK-A  .size   myGlobal__asan_instrumented, 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 072c55f79caa9dc..d71ee82ce6ca628 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -758,6 +758,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 "asan_instrumented" attribute and extract
+  // the actual global variable size.
+  uint64_t ActualSize = 0;
+  if (GV->hasAttribute(Attribute::SanitizeAddress)) {
+StructType *ST = dyn_cast(GV->getValueType());
+if (ST && ST->getNumElements() == 2) {
+  auto *ET0 = ST->getElementType(0);
+  if (ET0 && isa(ST->getElementType(1))) {
+ActualSize = DL.getTypeAllocSize(ET0);
+  }
+}
+  }
+
   for (const HandlerInfo  : Handlers) {
 NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
HI.TimerGroupName, HI.TimerGroupDescription,
@@ -868,6 +881,18 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable 
*GV) {
 
   MCSymbol *EmittedInitSym = GVSym;
 
+  if (GV->hasAttribute(Attribute::SanitizeAddress)) {
+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("__asan_instrumented"));
+emitVisibility(EmittedInitSym, GV->getVisibility(), !GV->isDeclaration());
+  }
+
   OutStreamer->switchSection(TheSection);
 
   emitLinkage(GV, EmittedInitSym);
@@ -875,7 +900,8 @@ void AsmPrinter::emitGlobalVariable(const GlobalVariable 
*GV) {
 
   OutStreamer->emitLabel(EmittedInitSym);
   MCSymbol *LocalAlias = getSymbolPreferLocal(*GV);
-  if (LocalAlias != EmittedInitSym)
+  if ((LocalAlias != EmittedInitSym) &&
+  !GV->hasAttribute(Attribute::SanitizeAddress))
 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 e80ee1953de6b21..c5ef705d8ca9e30 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2441,6 +2441,9 @@ void 
ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> , Module ,
 // zero so we can copy the metadata over as is.
 NewGlobal->copyMetadata(G, 0);
 
+// Attach "asan_instrumented" attribute to the new global.
+NewGlobal->addAttribute(Attribute::SanitizeAddress);
+
 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