diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2025-05-27 12:23:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-27 12:23:12 -0700 |
commit | 645f0e6723f21aef8099d8d65f5719fd9feb125e (patch) | |
tree | f39b5cfe6a4d9c59ab7cd07c77943ae2c4275c12 | |
parent | ea8838446678a1163b361b0598b1259e9f476900 (diff) | |
download | llvm-645f0e6723f21aef8099d8d65f5719fd9feb125e.zip llvm-645f0e6723f21aef8099d8d65f5719fd9feb125e.tar.gz llvm-645f0e6723f21aef8099d8d65f5719fd9feb125e.tar.bz2 |
IR: Make Module::getOrInsertGlobal() return a GlobalVariable.
After pointer element types were removed this function can only return
a GlobalVariable, so reflect that in the type and comments and clean
up callers.
Reviewers: nikic
Reviewed By: nikic
Pull Request: https://github.com/llvm/llvm-project/pull/141323
-rw-r--r-- | llvm/include/llvm/IR/Module.h | 7 | ||||
-rw-r--r-- | llvm/lib/CodeGen/LowerEmuTLS.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/CodeGen/WasmEHPrepare.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/IR/Module.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 6 | ||||
-rw-r--r-- | llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp | 3 | ||||
-rw-r--r-- | llvm/unittests/IR/ConstantsTest.cpp | 4 |
13 files changed, 32 insertions, 49 deletions
diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 53d10053..0dc8164 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 ec36b66..c81f018 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 c85f0c7..935afaf 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 fc98f59..1ea3e6b 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 c7daaaf..eb635dc 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 91e84a9..2bad83e 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, diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp index aa527ae..3a25255 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 090e7cf..d94a2fb 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 2f77121..e81a725 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 6bbf99c..fa1db28 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 9c6660d..5b8ea15 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/unittests/Analysis/BasicAliasAnalysisTest.cpp b/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp index 4e96b66..f5c73ff 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 41cc212..54c7ddd 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)); |