Skip to content

IR: Make Module::getOrInsertGlobal() return a GlobalVariable. #141323

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions llvm/include/llvm/IR/Module.h
Original file line number Diff line number Diff line change
@@ -471,15 +471,14 @@ class LLVM_ABI Module {

/// 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
6 changes: 2 additions & 4 deletions llvm/lib/CodeGen/LowerEmuTLS.cpp
Original file line number Diff line number Diff line change
@@ -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));
7 changes: 3 additions & 4 deletions llvm/lib/CodeGen/TargetLoweringBase.cpp
Original file line number Diff line number Diff line change
@@ -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;
}
3 changes: 1 addition & 2 deletions llvm/lib/CodeGen/WasmEHPrepare.cpp
Original file line number Diff line number Diff line change
@@ -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;
11 changes: 4 additions & 7 deletions llvm/lib/IR/Module.cpp
Original file line number Diff line number Diff line change
@@ -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);
9 changes: 4 additions & 5 deletions llvm/lib/Transforms/IPO/LowerTypeTests.cpp
Original file line number Diff line number Diff line change
@@ -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,
8 changes: 3 additions & 5 deletions llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
Original file line number Diff line number Diff line change
@@ -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,
10 changes: 4 additions & 6 deletions llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
Original file line number Diff line number Diff line change
@@ -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.
3 changes: 1 addition & 2 deletions llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
Original file line number Diff line number Diff line change
@@ -692,15 +692,14 @@ 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,
GlobalVariable::InitialExecTLSModel);
appendToCompilerUsed(M, GV);
return GV;
});
ThreadPtrGlobal = cast<GlobalVariable>(C);
}
}

Original file line number Diff line number Diff line change
@@ -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)
6 changes: 2 additions & 4 deletions llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
Original file line number Diff line number Diff line change
@@ -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;
3 changes: 1 addition & 2 deletions llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp
Original file line number Diff line number Diff line change
@@ -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.
4 changes: 2 additions & 2 deletions llvm/unittests/IR/ConstantsTest.cpp
Original file line number Diff line number Diff line change
@@ -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));
Loading
Oops, something went wrong.