summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2025-05-23 20:14:46 -0700
committerPeter Collingbourne <peter@pcc.me.uk>2025-05-23 20:14:46 -0700
commit49a3762b50c25d02460990423ed2b531b98b5827 (patch)
tree1f76f2bba95d49e153e990abe2b156fa237f0461
parentefa28338d858e1ea2bf705d50a0404bc602c8fe1 (diff)
Created using spr 1.3.6-beta.1 [skip ci]
-rw-r--r--llvm/include/llvm/IR/Module.h7
-rw-r--r--llvm/lib/CodeGen/LowerEmuTLS.cpp6
-rw-r--r--llvm/lib/CodeGen/TargetLoweringBase.cpp7
-rw-r--r--llvm/lib/CodeGen/WasmEHPrepare.cpp3
-rw-r--r--llvm/lib/IR/Module.cpp11
-rw-r--r--llvm/lib/Transforms/IPO/LowerTypeTests.cpp19
-rw-r--r--llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp8
-rw-r--r--llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp10
-rw-r--r--llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp3
-rw-r--r--llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp4
-rw-r--r--llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp6
-rw-r--r--llvm/test/Transforms/LowerTypeTests/import.ll14
-rw-r--r--llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp3
-rw-r--r--llvm/unittests/IR/ConstantsTest.cpp4
14 files changed, 47 insertions, 58 deletions
diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h
index 53d1005333ee..0dc8164b9c95 100644
--- a/llvm/include/llvm/IR/Module.h
+++ b/llvm/include/llvm/IR/Module.h
@@ -471,15 +471,14 @@ public:
/// Look up the specified global in the module symbol table.
/// If it does not exist, invoke a callback to create a declaration of the
- /// global and return it. The global is constantexpr casted to the expected
- /// type if necessary.
- Constant *
+ /// global and return it.
+ GlobalVariable *
getOrInsertGlobal(StringRef Name, Type *Ty,
function_ref<GlobalVariable *()> CreateGlobalCallback);
/// Look up the specified global in the module symbol table. If required, this
/// overload constructs the global variable using its constructor's defaults.
- Constant *getOrInsertGlobal(StringRef Name, Type *Ty);
+ GlobalVariable *getOrInsertGlobal(StringRef Name, Type *Ty);
/// @}
/// @name Global Alias Accessors
diff --git a/llvm/lib/CodeGen/LowerEmuTLS.cpp b/llvm/lib/CodeGen/LowerEmuTLS.cpp
index ec36b669ac01..c81f0184cf21 100644
--- a/llvm/lib/CodeGen/LowerEmuTLS.cpp
+++ b/llvm/lib/CodeGen/LowerEmuTLS.cpp
@@ -140,8 +140,7 @@ bool addEmuTlsVar(Module &M, const GlobalVariable *GV) {
PointerType *InitPtrType = PointerType::getUnqual(C);
Type *ElementTypes[4] = {WordType, WordType, VoidPtrType, InitPtrType};
StructType *EmuTlsVarType = StructType::create(ElementTypes);
- EmuTlsVar = cast<GlobalVariable>(
- M.getOrInsertGlobal(EmuTlsVarName, EmuTlsVarType));
+ EmuTlsVar = M.getOrInsertGlobal(EmuTlsVarName, EmuTlsVarType);
copyLinkageVisibility(M, GV, EmuTlsVar);
// Define "__emutls_t.*" and "__emutls_v.*" only if GV is defined.
@@ -155,8 +154,7 @@ bool addEmuTlsVar(Module &M, const GlobalVariable *GV) {
GlobalVariable *EmuTlsTmplVar = nullptr;
if (InitValue) {
std::string EmuTlsTmplName = ("__emutls_t." + GV->getName()).str();
- EmuTlsTmplVar = dyn_cast_or_null<GlobalVariable>(
- M.getOrInsertGlobal(EmuTlsTmplName, GVType));
+ EmuTlsTmplVar = M.getOrInsertGlobal(EmuTlsTmplName, GVType);
assert(EmuTlsTmplVar && "Failed to create emualted TLS initializer");
EmuTlsTmplVar->setConstant(true);
EmuTlsTmplVar->setInitializer(const_cast<Constant*>(InitValue));
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index c85f0c71ef25..935afaf9dd55 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -1975,10 +1975,9 @@ Value *TargetLoweringBase::getIRStackGuard(IRBuilderBase &IRB) const {
if (getTargetMachine().getTargetTriple().isOSOpenBSD()) {
Module &M = *IRB.GetInsertBlock()->getParent()->getParent();
PointerType *PtrTy = PointerType::getUnqual(M.getContext());
- Constant *C = M.getOrInsertGlobal("__guard_local", PtrTy);
- if (GlobalVariable *G = dyn_cast_or_null<GlobalVariable>(C))
- G->setVisibility(GlobalValue::HiddenVisibility);
- return C;
+ GlobalVariable *G = M.getOrInsertGlobal("__guard_local", PtrTy);
+ G->setVisibility(GlobalValue::HiddenVisibility);
+ return G;
}
return nullptr;
}
diff --git a/llvm/lib/CodeGen/WasmEHPrepare.cpp b/llvm/lib/CodeGen/WasmEHPrepare.cpp
index fc98f594660b..1ea3e6bcb15c 100644
--- a/llvm/lib/CodeGen/WasmEHPrepare.cpp
+++ b/llvm/lib/CodeGen/WasmEHPrepare.cpp
@@ -247,8 +247,7 @@ bool WasmEHPrepareImpl::prepareEHPads(Function &F) {
// we depend on CoalesceFeaturesAndStripAtomics to downgrade it to
// non-thread-local ones, in which case we don't allow this object to be
// linked with other objects using shared memory.
- LPadContextGV = cast<GlobalVariable>(
- M.getOrInsertGlobal("__wasm_lpad_context", LPadContextTy));
+ LPadContextGV = M.getOrInsertGlobal("__wasm_lpad_context", LPadContextTy);
LPadContextGV->setThreadLocalMode(GlobalValue::GeneralDynamicTLSModel);
LPadIndexField = LPadContextGV;
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp
index c7daaafe13e3..eb635dc29aee 100644
--- a/llvm/lib/IR/Module.cpp
+++ b/llvm/lib/IR/Module.cpp
@@ -250,12 +250,9 @@ GlobalVariable *Module::getGlobalVariable(StringRef Name,
}
/// getOrInsertGlobal - Look up the specified global in the module symbol table.
-/// 1. If it does not exist, add a declaration of the global and return it.
-/// 2. Else, the global exists but has the wrong type: return the function
-/// with a constantexpr cast to the right type.
-/// 3. Finally, if the existing global is the correct declaration, return the
-/// existing global.
-Constant *Module::getOrInsertGlobal(
+/// If it does not exist, add a declaration of the global and return it.
+/// Otherwise, return the existing global.
+GlobalVariable *Module::getOrInsertGlobal(
StringRef Name, Type *Ty,
function_ref<GlobalVariable *()> CreateGlobalCallback) {
// See if we have a definition for the specified global already.
@@ -269,7 +266,7 @@ Constant *Module::getOrInsertGlobal(
}
// Overload to construct a global variable using its constructor's defaults.
-Constant *Module::getOrInsertGlobal(StringRef Name, Type *Ty) {
+GlobalVariable *Module::getOrInsertGlobal(StringRef Name, Type *Ty) {
return getOrInsertGlobal(Name, Ty, [&] {
return new GlobalVariable(*this, Ty, false, GlobalVariable::ExternalLinkage,
nullptr, Name);
diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
index ebabece067db..428c4641a7f5 100644
--- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
+++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
@@ -983,11 +983,10 @@ LowerTypeTestsModule::importTypeId(StringRef TypeId) {
auto ImportGlobal = [&](StringRef Name) {
// Give the global a type of length 0 so that it is not assumed not to alias
// with any other global.
- Constant *C = M.getOrInsertGlobal(("__typeid_" + TypeId + "_" + Name).str(),
- Int8Arr0Ty);
- if (auto *GV = dyn_cast<GlobalVariable>(C))
- GV->setVisibility(GlobalValue::HiddenVisibility);
- return C;
+ GlobalVariable *GV = M.getOrInsertGlobal(
+ ("__typeid_" + TypeId + "_" + Name).str(), Int8Arr0Ty);
+ GV->setVisibility(GlobalValue::HiddenVisibility);
+ return GV;
};
auto ImportConstant = [&](StringRef Name, uint64_t Const, unsigned AbsWidth,
@@ -1020,8 +1019,14 @@ LowerTypeTestsModule::importTypeId(StringRef TypeId) {
return C;
};
- if (TIL.TheKind != TypeTestResolution::Unsat)
- TIL.OffsetedGlobal = ImportGlobal("global_addr");
+ if (TIL.TheKind != TypeTestResolution::Unsat) {
+ auto *GV = ImportGlobal("global_addr");
+ // This is either a vtable (in .data.rel.ro) or a jump table (in .text).
+ // Either way it's expected to be in the low 2 GiB, so set the small code
+ // model.
+ GV->setCodeModel(CodeModel::Small);
+ TIL.OffsetedGlobal = GV;
+ }
if (TIL.TheKind == TypeTestResolution::ByteArray ||
TIL.TheKind == TypeTestResolution::Inline ||
diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
index aa527aec622b..3a25255d0a4c 100644
--- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
+++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
@@ -1689,12 +1689,10 @@ void DevirtModule::exportConstant(VTableSlot Slot, ArrayRef<uint64_t> Args,
Constant *DevirtModule::importGlobal(VTableSlot Slot, ArrayRef<uint64_t> Args,
StringRef Name) {
- Constant *C =
+ GlobalVariable *GV =
M.getOrInsertGlobal(getGlobalName(Slot, Args, Name), Int8Arr0Ty);
- auto *GV = dyn_cast<GlobalVariable>(C);
- if (GV)
- GV->setVisibility(GlobalValue::HiddenVisibility);
- return C;
+ GV->setVisibility(GlobalValue::HiddenVisibility);
+ return GV;
}
Constant *DevirtModule::importConstant(VTableSlot Slot, ArrayRef<uint64_t> Args,
diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
index 090e7cf7345f..d94a2fbb23d2 100644
--- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
@@ -1506,12 +1506,10 @@ bool DataFlowSanitizer::runImpl(
auto GetOrInsertGlobal = [this, &Changed](StringRef Name,
Type *Ty) -> Constant * {
- Constant *C = Mod->getOrInsertGlobal(Name, Ty);
- if (GlobalVariable *G = dyn_cast<GlobalVariable>(C)) {
- Changed |= G->getThreadLocalMode() != GlobalVariable::InitialExecTLSModel;
- G->setThreadLocalMode(GlobalVariable::InitialExecTLSModel);
- }
- return C;
+ GlobalVariable *G = Mod->getOrInsertGlobal(Name, Ty);
+ Changed |= G->getThreadLocalMode() != GlobalVariable::InitialExecTLSModel;
+ G->setThreadLocalMode(GlobalVariable::InitialExecTLSModel);
+ return G;
};
// These globals must be kept in sync with the ones in dfsan.cpp.
diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
index 2f7712171bab..e81a725c62ea 100644
--- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
@@ -692,7 +692,7 @@ void HWAddressSanitizer::initializeModule() {
}
if (!TargetTriple.isAndroid()) {
- Constant *C = M.getOrInsertGlobal("__hwasan_tls", IntptrTy, [&] {
+ ThreadPtrGlobal = M.getOrInsertGlobal("__hwasan_tls", IntptrTy, [&] {
auto *GV = new GlobalVariable(M, IntptrTy, /*isConstant=*/false,
GlobalValue::ExternalLinkage, nullptr,
"__hwasan_tls", nullptr,
@@ -700,7 +700,6 @@ void HWAddressSanitizer::initializeModule() {
appendToCompilerUsed(M, GV);
return GV;
});
- ThreadPtrGlobal = cast<GlobalVariable>(C);
}
}
diff --git a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
index 6bbf99cd8d51..fa1db288fbb2 100644
--- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
@@ -642,11 +642,11 @@ NumericalStabilitySanitizerPass::run(Module &M, ModuleAnalysisManager &MAM) {
}
static GlobalValue *createThreadLocalGV(const char *Name, Module &M, Type *Ty) {
- return dyn_cast<GlobalValue>(M.getOrInsertGlobal(Name, Ty, [&M, Ty, Name] {
+ return M.getOrInsertGlobal(Name, Ty, [&M, Ty, Name] {
return new GlobalVariable(M, Ty, false, GlobalVariable::ExternalLinkage,
nullptr, Name, nullptr,
GlobalVariable::InitialExecTLSModel);
- }));
+ });
}
NumericalStabilitySanitizer::NumericalStabilitySanitizer(Module &M)
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
index 9c6660d79322..5b8ea1547ca2 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
@@ -486,10 +486,8 @@ bool ModuleSanitizerCoverage::instrumentModule() {
SanCovTraceSwitchFunction =
M.getOrInsertFunction(SanCovTraceSwitchName, VoidTy, Int64Ty, PtrTy);
- Constant *SanCovLowestStackConstant =
- M.getOrInsertGlobal(SanCovLowestStackName, IntptrTy);
- SanCovLowestStack = dyn_cast<GlobalVariable>(SanCovLowestStackConstant);
- if (!SanCovLowestStack || SanCovLowestStack->getValueType() != IntptrTy) {
+ SanCovLowestStack = M.getOrInsertGlobal(SanCovLowestStackName, IntptrTy);
+ if (SanCovLowestStack->getValueType() != IntptrTy) {
C->emitError(StringRef("'") + SanCovLowestStackName +
"' should not be declared by the user");
return true;
diff --git a/llvm/test/Transforms/LowerTypeTests/import.ll b/llvm/test/Transforms/LowerTypeTests/import.ll
index 1eff4bbbbdf9..c6566b84a436 100644
--- a/llvm/test/Transforms/LowerTypeTests/import.ll
+++ b/llvm/test/Transforms/LowerTypeTests/import.ll
@@ -6,29 +6,29 @@ target datalayout = "e-p:64:64"
declare i1 @llvm.type.test(ptr %ptr, metadata %bitset) nounwind readnone
-; CHECK-DAG: @__typeid_single_global_addr = external hidden global [0 x i8]
-; CHECK-DAG: @__typeid_inline6_global_addr = external hidden global [0 x i8]
+; CHECK-DAG: @__typeid_single_global_addr = external hidden global [0 x i8], code_model "small"
+; CHECK-DAG: @__typeid_inline6_global_addr = external hidden global [0 x i8], code_model "small"
; X86-DAG: @__typeid_inline6_align = external hidden global [0 x i8], !absolute_symbol !0
; X86-DAG: @__typeid_inline6_size_m1 = external hidden global [0 x i8], !absolute_symbol !1
; X86-DAG: @__typeid_inline6_inline_bits = external hidden global [0 x i8], !absolute_symbol !2
-; CHECK-DAG: @__typeid_inline5_global_addr = external hidden global [0 x i8]
+; CHECK-DAG: @__typeid_inline5_global_addr = external hidden global [0 x i8], code_model "small"
; X86-DAG: @__typeid_inline5_align = external hidden global [0 x i8], !absolute_symbol !0
; X86-DAG: @__typeid_inline5_size_m1 = external hidden global [0 x i8], !absolute_symbol !3
; X86-DAG: @__typeid_inline5_inline_bits = external hidden global [0 x i8], !absolute_symbol !4
-; CHECK-DAG: @__typeid_bytearray32_global_addr = external hidden global [0 x i8]
+; CHECK-DAG: @__typeid_bytearray32_global_addr = external hidden global [0 x i8], code_model "small"
; X86-DAG: @__typeid_bytearray32_align = external hidden global [0 x i8], !absolute_symbol !0
; X86-DAG: @__typeid_bytearray32_size_m1 = external hidden global [0 x i8], !absolute_symbol !4
; CHECK-DAG: @__typeid_bytearray32_byte_array = external hidden global [0 x i8]
; X86-DAG: @__typeid_bytearray32_bit_mask = external hidden global [0 x i8], !absolute_symbol !0
-; CHECK-DAG: @__typeid_bytearray7_global_addr = external hidden global [0 x i8]
+; CHECK-DAG: @__typeid_bytearray7_global_addr = external hidden global [0 x i8], code_model "small"
; X86-DAG: @__typeid_bytearray7_align = external hidden global [0 x i8], !absolute_symbol !0
; X86-DAG: @__typeid_bytearray7_size_m1 = external hidden global [0 x i8], !absolute_symbol !5
; CHECK-DAG: @__typeid_bytearray7_byte_array = external hidden global [0 x i8]
; X86-DAG: @__typeid_bytearray7_bit_mask = external hidden global [0 x i8], !absolute_symbol !0
-; CHECK-DAG: @__typeid_allones32_global_addr = external hidden global [0 x i8]
+; CHECK-DAG: @__typeid_allones32_global_addr = external hidden global [0 x i8], code_model "small"
; X86-DAG: @__typeid_allones32_align = external hidden global [0 x i8], !absolute_symbol !0
; X86-DAG: @__typeid_allones32_size_m1 = external hidden global [0 x i8], !absolute_symbol !4
-; CHECK-DAG: @__typeid_allones7_global_addr = external hidden global [0 x i8]
+; CHECK-DAG: @__typeid_allones7_global_addr = external hidden global [0 x i8], code_model "small"
; X86-DAG: @__typeid_allones7_align = external hidden global [0 x i8], !absolute_symbol !0
; X86-DAG: @__typeid_allones7_size_m1 = external hidden global [0 x i8], !absolute_symbol !5
diff --git a/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp b/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp
index 4e96b6677661..f5c73ff63934 100644
--- a/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp
+++ b/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp
@@ -81,8 +81,7 @@ TEST_F(BasicAATest, AliasInstWithObjectOfImpreciseSize) {
Value *IncomingI32Ptr = F->arg_begin();
- auto *GlobalPtr =
- cast<GlobalVariable>(M.getOrInsertGlobal("some_global", B.getInt8Ty()));
+ auto *GlobalPtr = M.getOrInsertGlobal("some_global", B.getInt8Ty());
// Without sufficiently restricted linkage/an init, some of the object size
// checking bits get more conservative.
diff --git a/llvm/unittests/IR/ConstantsTest.cpp b/llvm/unittests/IR/ConstantsTest.cpp
index 41cc212f00de..54c7ddd003fc 100644
--- a/llvm/unittests/IR/ConstantsTest.cpp
+++ b/llvm/unittests/IR/ConstantsTest.cpp
@@ -774,12 +774,12 @@ TEST(ConstantsTest, ComdatUserTracking) {
EXPECT_TRUE(Users.size() == 0);
Type *Ty = Type::getInt8Ty(Context);
- GlobalVariable *GV1 = cast<GlobalVariable>(M.getOrInsertGlobal("gv1", Ty));
+ GlobalVariable *GV1 = M.getOrInsertGlobal("gv1", Ty);
GV1->setComdat(C);
EXPECT_TRUE(Users.size() == 1);
EXPECT_TRUE(Users.contains(GV1));
- GlobalVariable *GV2 = cast<GlobalVariable>(M.getOrInsertGlobal("gv2", Ty));
+ GlobalVariable *GV2 = M.getOrInsertGlobal("gv2", Ty);
GV2->setComdat(C);
EXPECT_TRUE(Users.size() == 2);
EXPECT_TRUE(Users.contains(GV2));