[llvm] ac02bca - [IRSymTab] Mark __stack_chk_guard used

Yuanfang Chen via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 28 11:23:37 PDT 2021


Author: Yuanfang Chen
Date: 2021-10-28T11:22:26-07:00
New Revision: ac02bcad56f5769066a538bce76c51142671b7dc

URL: https://github.com/llvm/llvm-project/commit/ac02bcad56f5769066a538bce76c51142671b7dc
DIFF: https://github.com/llvm/llvm-project/commit/ac02bcad56f5769066a538bce76c51142671b7dc.diff

LOG: [IRSymTab] Mark __stack_chk_guard used

`__stack_chk_guard` is a global variable that has no uses before the LLVM code generation phase (how it is defined is platform-dependent). LTO needs to preserve this symbol for that reason. Currently, legacy LTO API preserves it by hardcoding the logic in Internalizer, but this symbol is not preserved by regular LTO API in thinlink phase. This patch marks `__stack_chk_guard` used during IR symbol table writing since this is how builtin functions are preserved by thinlink by using `RuntimeLibcalls.def`.

Reviewed By: MaskRay, tejohnson

Differential Revision: https://reviews.llvm.org/D112595

Added: 
    llvm/test/ThinLTO/X86/builtin-nostrip-aix.ll

Modified: 
    llvm/lib/Object/IRSymtab.cpp
    llvm/test/ThinLTO/X86/builtin-nostrip.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp
index 9c9b2d80d23d..093ae1bbc267 100644
--- a/llvm/lib/Object/IRSymtab.cpp
+++ b/llvm/lib/Object/IRSymtab.cpp
@@ -41,10 +41,15 @@
 using namespace llvm;
 using namespace irsymtab;
 
-static const char *LibcallRoutineNames[] = {
+static const char *PreservedSymbols[] = {
 #define HANDLE_LIBCALL(code, name) name,
 #include "llvm/IR/RuntimeLibcalls.def"
 #undef HANDLE_LIBCALL
+    // There are global variables, so put it here instead of in
+    // RuntimeLibcalls.def.
+    // TODO: Are there similar such variables?
+    "__ssp_canary_word",
+    "__stack_chk_guard",
 };
 
 namespace {
@@ -261,9 +266,9 @@ Error Builder::addSymbol(const ModuleSymbolTable &Msymtab,
 
   setStr(Sym.IRName, GV->getName());
 
-  bool IsBuiltinFunc = llvm::is_contained(LibcallRoutineNames, GV->getName());
+  bool IsPreservedSymbol = llvm::is_contained(PreservedSymbols, GV->getName());
 
-  if (Used.count(GV) || IsBuiltinFunc)
+  if (Used.count(GV) || IsPreservedSymbol)
     Sym.Flags |= 1 << storage::Symbol::FB_used;
   if (GV->isThreadLocal())
     Sym.Flags |= 1 << storage::Symbol::FB_tls;

diff  --git a/llvm/test/ThinLTO/X86/builtin-nostrip-aix.ll b/llvm/test/ThinLTO/X86/builtin-nostrip-aix.ll
new file mode 100644
index 000000000000..428a5217afd4
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/builtin-nostrip-aix.ll
@@ -0,0 +1,44 @@
+; REQUIRES: powerpc-registered-target
+; Compile with thinlto indices, to enable thinlto.
+; RUN: opt -module-summary %s -o %t1.bc
+
+; Test old lto interface with thinlto.
+; RUN: llvm-lto -exported-symbol=main -thinlto-action=run %t1.bc
+; RUN: llvm-nm %t1.bc | FileCheck %s --check-prefix=CHECK-NM
+
+; Test new lto interface with thinlto.
+; RUN: llvm-lto2 run %t1.bc -o %t.out -save-temps \
+; RUN:   -r %t1.bc,bar,pl \
+; RUN:   -r %t1.bc,__ssp_canary_word,pl \
+; RUN:   -r %t1.bc,__stack_chk_fail,pl
+; RUN: llvm-nm %t.out.1.2.internalize.bc | FileCheck %s --check-prefix=CHECK-NM
+
+; Re-compile, this time without the thinlto indices.
+; RUN: opt %s -o %t4.bc
+
+; Test the new lto interface without thinlto.
+; RUN: llvm-lto2 run %t4.bc -o %t5.out -save-temps \
+; RUN:   -r %t4.bc,bar,pl \
+; RUN:   -r %t4.bc,__ssp_canary_word,pl \
+; RUN:   -r %t4.bc,__stack_chk_fail,pl
+; RUN: llvm-nm %t5.out.0.2.internalize.bc | FileCheck %s --check-prefix=CHECK-NM
+
+; Test the old lto interface without thinlto.
+; RUN: llvm-lto -exported-symbol=main -save-merged-module %t4.bc -o %t6
+; RUN: llvm-nm %t6.merged.bc | FileCheck %s --check-prefix=CHECK-NM
+
+; CHECK-NM: D __ssp_canary_word
+; CHECK-NM: T __stack_chk_fail
+
+target datalayout = "E-m:a-p:32:32-i64:64-n32"
+target triple = "powerpc-ibm-aix-xcoff"
+
+define void @bar() {
+    ret void
+}
+
+ at __ssp_canary_word = dso_local global i64 1, align 8
+
+define void @__stack_chk_fail() {
+    ret void
+}

diff  --git a/llvm/test/ThinLTO/X86/builtin-nostrip.ll b/llvm/test/ThinLTO/X86/builtin-nostrip.ll
index 615ac741f635..1b6a4ef87925 100644
--- a/llvm/test/ThinLTO/X86/builtin-nostrip.ll
+++ b/llvm/test/ThinLTO/X86/builtin-nostrip.ll
@@ -9,6 +9,7 @@
 ; Test new lto interface with thinlto.
 ; RUN: llvm-lto2 run %t1.bc -o %t.out -save-temps \
 ; RUN:   -r %t1.bc,bar,pl \
+; RUN:   -r %t1.bc,__stack_chk_guard,pl \
 ; RUN:   -r %t1.bc,__stack_chk_fail,pl
 ; RUN: llvm-nm %t.out.1 | FileCheck %s --check-prefix=CHECK-NM
 
@@ -18,6 +19,7 @@
 ; Test the new lto interface without thinlto.
 ; RUN: llvm-lto2 run %t4.bc -o %t5.out -save-temps \
 ; RUN:   -r %t4.bc,bar,pl \
+; RUN:   -r %t4.bc,__stack_chk_guard,pl \
 ; RUN:   -r %t4.bc,__stack_chk_fail,pl
 ; RUN: llvm-nm %t5.out.0 | FileCheck %s --check-prefix=CHECK-NM
 
@@ -27,6 +29,7 @@
 
 ; CHECK-NM-NOT: bar
 ; CHECK-NM: T __stack_chk_fail
+; CHECK-NM: D __stack_chk_guard
 ; CHECK-NM-NOT: bar
 
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -36,6 +39,8 @@ define void @bar() {
     ret void
 }
 
+ at __stack_chk_guard = dso_local global i64 1, align 8
+
 define void @__stack_chk_fail() {
     ret void
 }


        


More information about the llvm-commits mailing list