[clang] [LTO] A static relocation model can override the PIC level wrt treating external address as directly accessible (PR #65512)
Wolfgang Pieb via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 19 17:11:08 PDT 2023
https://github.com/wolfy1961 updated https://github.com/llvm/llvm-project/pull/65512
>From 2e5abcec65c189fbb7f789816373969ee81ecfa5 Mon Sep 17 00:00:00 2001
From: wpieb <Wolfgang.Pieb at sony.com>
Date: Tue, 5 Sep 2023 10:43:23 -0700
Subject: [PATCH 1/2] [LTO] A static relocation model can override the PIC
level wrt treating external address as directly accessible.
Fixes https://github.com/llvm/llvm-project/issues/64999
---
clang/lib/CodeGen/CodeGenModule.cpp | 5 +++--
llvm/include/llvm/IR/Module.h | 2 +-
llvm/lib/CodeGen/TargetLoweringBase.cpp | 3 ++-
llvm/lib/IR/Module.cpp | 4 ++--
llvm/lib/Target/X86/X86ISelLoweringCall.cpp | 3 ++-
5 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 8b0c9340775cbe9..c8756d0b5f56a57 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1127,7 +1127,8 @@ void CodeGenModule::Release() {
if (LangOpts.HLSL)
getHLSLRuntime().finishCodeGen();
- if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
+ uint32_t PLevel = Context.getLangOpts().PICLevel;
+ if (PLevel) {
assert(PLevel < 3 && "Invalid PIC Level");
getModule().setPICLevel(static_cast<llvm::PICLevel::Level>(PLevel));
if (Context.getLangOpts().PIE)
@@ -1152,7 +1153,7 @@ void CodeGenModule::Release() {
getModule().setRtLibUseGOT();
if (getTriple().isOSBinFormatELF() &&
CodeGenOpts.DirectAccessExternalData !=
- getModule().getDirectAccessExternalData()) {
+ getModule().getDirectAccessExternalData(PLevel == 0)) {
getModule().setDirectAccessExternalData(
CodeGenOpts.DirectAccessExternalData);
}
diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h
index 70beddddc1c1615..cade1fccd4c5c17 100644
--- a/llvm/include/llvm/IR/Module.h
+++ b/llvm/include/llvm/IR/Module.h
@@ -958,7 +958,7 @@ class LLVM_EXTERNAL_VISIBILITY Module {
/// Get/set whether referencing global variables can use direct access
/// relocations on ELF targets.
- bool getDirectAccessExternalData() const;
+ bool getDirectAccessExternalData(bool IsStaticRelocModel) const;
void setDirectAccessExternalData(bool Value);
/// Get/set whether synthesized functions should get the uwtable attribute.
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 3e4bff5ddce1264..e1f439fd32dad1a 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -2016,7 +2016,8 @@ void TargetLoweringBase::insertSSPDeclarations(Module &M) const {
"__stack_chk_guard");
// FreeBSD has "__stack_chk_guard" defined externally on libc.so
- if (M.getDirectAccessExternalData() &&
+ if (M.getDirectAccessExternalData(TM.getRelocationModel() ==
+ Reloc::Static) &&
!TM.getTargetTriple().isWindowsGNUEnvironment() &&
!TM.getTargetTriple().isOSFreeBSD() &&
!TM.getTargetTriple().isOSDarwin())
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp
index dba660bbe5bafd3..db90bc0c9cae44b 100644
--- a/llvm/lib/IR/Module.cpp
+++ b/llvm/lib/IR/Module.cpp
@@ -687,12 +687,12 @@ void Module::setRtLibUseGOT() {
addModuleFlag(ModFlagBehavior::Max, "RtLibUseGOT", 1);
}
-bool Module::getDirectAccessExternalData() const {
+bool Module::getDirectAccessExternalData(bool IsStaticRelocModel) const {
auto *Val = cast_or_null<ConstantAsMetadata>(
getModuleFlag("direct-access-external-data"));
if (Val)
return cast<ConstantInt>(Val->getValue())->getZExtValue() > 0;
- return getPICLevel() == PICLevel::NotPIC;
+ return getPICLevel() == PICLevel::NotPIC || IsStaticRelocModel;
}
void Module::setDirectAccessExternalData(bool Value) {
diff --git a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
index 754d2042105e57d..9eeb9bf682b1f41 100644
--- a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
+++ b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
@@ -606,7 +606,8 @@ Value *X86TargetLowering::getIRStackGuard(IRBuilderBase &IRB) const {
nullptr, GuardSymb, nullptr,
GlobalValue::NotThreadLocal, AddressSpace);
if (!Subtarget.isTargetDarwin())
- GV->setDSOLocal(M->getDirectAccessExternalData());
+ GV->setDSOLocal(M->getDirectAccessExternalData(
+ getTargetMachine().getRelocationModel() == Reloc::Static));
}
return GV;
}
>From 2ddd45b0c9c11bb38fcf88a55cf22269a6d16946 Mon Sep 17 00:00:00 2001
From: wpieb <Wolfgang.Pieb at sony.com>
Date: Tue, 19 Sep 2023 17:07:41 -0700
Subject: [PATCH 2/2] Adjust the test
---
llvm/test/LTO/ARM/ssp-static-reloc.ll | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/llvm/test/LTO/ARM/ssp-static-reloc.ll b/llvm/test/LTO/ARM/ssp-static-reloc.ll
index c8825c2aae0fbb6..bee3639e19d8222 100644
--- a/llvm/test/LTO/ARM/ssp-static-reloc.ll
+++ b/llvm/test/LTO/ARM/ssp-static-reloc.ll
@@ -2,9 +2,8 @@
; RUN: llvm-lto -O0 -relocation-model=static -o %t.o %t.bc
; RUN: llvm-objdump -d -r %t.o | FileCheck %s
-; Confirm that we do generate one too many indirections accessing the stack guard
-; variable, when the relocation model is static and the PIC level is not 0..
-; This is preparation for the fix.
+; Confirm that we do not generate one too many indirections accessing the stack guard
+; variable, when the relocation model is static and the PIC level is not 0.
;
target triple = "armv4t-unknown-unknown"
@@ -20,8 +19,7 @@ entry:
; CHECK: <foo>:
; CHECK: [[#%x,CURPC:]]:{{.*}} ldr r[[REG1:[0-9]+]], [pc, #0x[[#%x,OFFSET:]]]
; CHECK-NEXT: ldr r[[REG2:[0-9]+]], [r[[REG1]]]
-; CHECK-NEXT: ldr r[[REG3:[0-9]+]], [r[[REG2]]]
-; CHECK-NEXT: str r[[REG3]],
+; CHECK-NEXT: str r[[REG2]],
; CHECK: [[#CURPC + OFFSET + 8]]:{{.*}}.word
; CHECK-NEXT: R_ARM_ABS32 __stack_chk_guard
More information about the cfe-commits
mailing list