[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