Skip to content

Commit

Permalink
Recommit: [NFC][IR] Make Module::getGlobalList() private
Browse files Browse the repository at this point in the history
This reverts commit cb5f239.
  • Loading branch information
vporpo committed Feb 14, 2023
1 parent 0a0d58f commit 823186b
Show file tree
Hide file tree
Showing 15 changed files with 82 additions and 28 deletions.
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CGHLSLRuntime.cpp
Expand Up @@ -175,7 +175,7 @@ void CGHLSLRuntime::finishCodeGen() {
for (auto &Buf : Buffers) {
layoutBuffer(Buf, DL);
GlobalVariable *GV = replaceBuffer(Buf);
M.getGlobalList().push_back(GV);
M.insertGlobalVariable(GV);
llvm::hlsl::ResourceClass RC = Buf.IsCBuffer
? llvm::hlsl::ResourceClass::CBuffer
: llvm::hlsl::ResourceClass::SRV;
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CGObjCMac.cpp
Expand Up @@ -7431,7 +7431,7 @@ CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name,
GV->eraseFromParent();
}
GV = NewGV;
CGM.getModule().getGlobalList().push_back(GV);
CGM.getModule().insertGlobalVariable(GV);
}

assert(GV->getLinkage() == L);
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Expression/IRExecutionUnit.cpp
Expand Up @@ -406,7 +406,7 @@ void IRExecutionUnit::GetRunnableInfo(Status &error, lldb::addr_t &func_addr,
}
};

for (llvm::GlobalVariable &global_var : m_module->getGlobalList()) {
for (llvm::GlobalVariable &global_var : m_module->globals()) {
RegisterOneValue(global_var);
}

Expand Down
9 changes: 3 additions & 6 deletions llvm/docs/ProgrammersManual.rst
Expand Up @@ -3429,17 +3429,14 @@ Important Public Members of the ``Module`` class

* | ``Module::global_iterator`` - Typedef for global variable list iterator
| ``Module::const_global_iterator`` - Typedef for const_iterator.
| ``Module::insertGlobalVariable()`` - Inserts a global variable to the list.
| ``Module::removeGlobalVariable()`` - Removes a global variable frome the list.
| ``Module::eraseGlobalVariable()`` - Removes a global variable frome the list and deletes it.
| ``global_begin()``, ``global_end()``, ``global_size()``, ``global_empty()``
These are forwarding methods that make it easy to access the contents of a
``Module`` object's GlobalVariable_ list.

* ``Module::GlobalListType &getGlobalList()``

Returns the list of GlobalVariable_\ s. This is necessary to use when you
need to update the list or perform a complex action that doesn't have a
forwarding method.

----------------

* ``SymbolTable *getSymbolTable()``
Expand Down
20 changes: 20 additions & 0 deletions llvm/include/llvm/IR/Module.h
Expand Up @@ -542,6 +542,24 @@ class LLVM_EXTERNAL_VISIBILITY Module {

llvm::Error materializeMetadata();

/// Detach global variable \p GV from the list but don't delete it.
void removeGlobalVariable(GlobalVariable *GV) { GlobalList.remove(GV); }
/// Remove global variable \p GV from the list and delete it.
void eraseGlobalVariable(GlobalVariable *GV) { GlobalList.erase(GV); }
/// Insert global variable \p GV at the end of the global variable list and
/// take ownership.
void insertGlobalVariable(GlobalVariable *GV) {
insertGlobalVariable(GlobalList.end(), GV);
}
/// Insert global variable \p GV into the global variable list before \p
/// Where and take ownership.
void insertGlobalVariable(GlobalListType::iterator Where, GlobalVariable *GV) {
GlobalList.insert(Where, GV);
}
// Use global_size() to get the total number of global variables.
// Use globals() to get the range of all global variables.

private:
/// @}
/// @name Direct access to the globals list, functions list, and symbol table
/// @{
Expand All @@ -554,7 +572,9 @@ class LLVM_EXTERNAL_VISIBILITY Module {
static GlobalListType Module::*getSublistAccess(GlobalVariable*) {
return &Module::GlobalList;
}
friend class llvm::SymbolTableListTraits<llvm::GlobalVariable>;

public:
/// Get the Module's list of functions (constant).
const FunctionListType &getFunctionList() const { return FunctionList; }
/// Get the Module's list of functions.
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Bitcode/Reader/BitcodeReader.cpp
Expand Up @@ -3693,7 +3693,7 @@ Error BitcodeReader::globalCleanup() {
UpgradedVariables.emplace_back(&GV, Upgraded);
for (auto &Pair : UpgradedVariables) {
Pair.first->eraseFromParent();
TheModule->getGlobalList().push_back(Pair.second);
TheModule->insertGlobalVariable(Pair.second);
}

// Force deallocation of memory for these vectors to favor the client that
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
Expand Up @@ -571,7 +571,7 @@ Constant *OpenMPIRBuilder::getOrCreateIdent(Constant *SrcLocStr,

// Look for existing encoding of the location + flags, not needed but
// minimizes the difference to the existing solution while we transition.
for (GlobalVariable &GV : M.getGlobalList())
for (GlobalVariable &GV : M.globals())
if (GV.getValueType() == OpenMPIRBuilder::Ident && GV.hasInitializer())
if (GV.getInitializer() == Initializer)
Ident = &GV;
Expand Down Expand Up @@ -601,7 +601,7 @@ Constant *OpenMPIRBuilder::getOrCreateSrcLocStr(StringRef LocStr,

// Look for existing encoding of the location, not needed but minimizes the
// difference to the existing solution while we transition.
for (GlobalVariable &GV : M.getGlobalList())
for (GlobalVariable &GV : M.globals())
if (GV.isConstant() && GV.hasInitializer() &&
GV.getInitializer() == Initializer)
return SrcLocStr = ConstantExpr::getPointerCast(&GV, Int8Ptr);
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/IR/Globals.cpp
Expand Up @@ -456,17 +456,17 @@ GlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant,
}

if (Before)
Before->getParent()->getGlobalList().insert(Before->getIterator(), this);
Before->getParent()->insertGlobalVariable(Before->getIterator(), this);
else
M.getGlobalList().push_back(this);
M.insertGlobalVariable(this);
}

void GlobalVariable::removeFromParent() {
getParent()->getGlobalList().remove(getIterator());
getParent()->removeGlobalVariable(this);
}

void GlobalVariable::eraseFromParent() {
getParent()->getGlobalList().erase(getIterator());
getParent()->eraseGlobalVariable(this);
}

void GlobalVariable::setInitializer(Constant *InitVal) {
Expand Down
7 changes: 4 additions & 3 deletions llvm/lib/Linker/IRMover.cpp
Expand Up @@ -1671,15 +1671,16 @@ Error IRLinker::run() {

// Reorder the globals just added to the destination module to match their
// original order in the source module.
Module::GlobalListType &Globals = DstM.getGlobalList();
for (GlobalVariable &GV : SrcM->globals()) {
if (GV.hasAppendingLinkage())
continue;
Value *NewValue = Mapper.mapValue(GV);
if (NewValue) {
auto *NewGV = dyn_cast<GlobalVariable>(NewValue->stripPointerCasts());
if (NewGV)
Globals.splice(Globals.end(), Globals, NewGV->getIterator());
if (NewGV) {
NewGV->removeFromParent();
DstM.insertGlobalVariable(NewGV);
}
}
}

Expand Down
3 changes: 1 addition & 2 deletions llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
Expand Up @@ -826,8 +826,7 @@ void NVPTXAsmPrinter::emitGlobals(const Module &M) {
for (const GlobalVariable &I : M.globals())
VisitGlobalVariableForEmission(&I, Globals, GVVisited, GVVisiting);

assert(GVVisited.size() == M.getGlobalList().size() &&
"Missed a global variable");
assert(GVVisited.size() == M.global_size() && "Missed a global variable");
assert(GVVisiting.size() == 0 && "Did not fully process a global variable");

const NVPTXTargetMachine &NTM = static_cast<const NVPTXTargetMachine &>(TM);
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/IPO/GlobalOpt.cpp
Expand Up @@ -976,7 +976,7 @@ OptimizeGlobalAddressOfAllocation(GlobalVariable *GV, CallInst *CI,
cast<StoreInst>(InitBool->user_back())->eraseFromParent();
delete InitBool;
} else
GV->getParent()->getGlobalList().insert(GV->getIterator(), InitBool);
GV->getParent()->insertGlobalVariable(GV->getIterator(), InitBool);

// Now the GV is dead, nuke it and the allocation..
GV->eraseFromParent();
Expand Down Expand Up @@ -1158,7 +1158,7 @@ static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) {
GV->getThreadLocalMode(),
GV->getType()->getAddressSpace());
NewGV->copyAttributesFrom(GV);
GV->getParent()->getGlobalList().insert(GV->getIterator(), NewGV);
GV->getParent()->insertGlobalVariable(GV->getIterator(), NewGV);

Constant *InitVal = GV->getInitializer();
assert(InitVal->getType() != Type::getInt1Ty(GV->getContext()) &&
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/SCCP.cpp
Expand Up @@ -370,7 +370,7 @@ static bool runIPSCCP(
SI->eraseFromParent();
MadeChanges = true;
}
M.getGlobalList().erase(GV);
M.eraseGlobalVariable(GV);
++NumGlobalConst;
}

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
Expand Up @@ -958,7 +958,7 @@ void DevirtModule::buildTypeIdentifierMap(
std::vector<VTableBits> &Bits,
DenseMap<Metadata *, std::set<TypeMemberInfo>> &TypeIdMap) {
DenseMap<GlobalVariable *, VTableBits *> GVToBits;
Bits.reserve(M.getGlobalList().size());
Bits.reserve(M.global_size());
SmallVector<MDNode *, 2> Types;
for (GlobalVariable &GV : M.globals()) {
Types.clear();
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/Utils/CtorUtils.cpp
Expand Up @@ -48,7 +48,7 @@ static void removeGlobalCtors(GlobalVariable *GCL, const BitVector &CtorsToRemov
GlobalVariable *NGV =
new GlobalVariable(CA->getType(), GCL->isConstant(), GCL->getLinkage(),
CA, "", GCL->getThreadLocalMode());
GCL->getParent()->getGlobalList().insert(GCL->getIterator(), NGV);
GCL->getParent()->insertGlobalVariable(GCL->getIterator(), NGV);
NGV->takeName(GCL);

// Nuke the old list, replacing any uses with the new one.
Expand Down
41 changes: 39 additions & 2 deletions llvm/unittests/IR/ModuleTest.cpp
Expand Up @@ -46,8 +46,6 @@ TEST(ModuleTest, sortGlobalsByName) {

// Sort the globals by name.
EXPECT_FALSE(std::is_sorted(M.global_begin(), M.global_end(), compare));
M.getGlobalList().sort(compare);
EXPECT_TRUE(std::is_sorted(M.global_begin(), M.global_end(), compare));
}
}

Expand Down Expand Up @@ -273,4 +271,43 @@ TEST(ModuleTest, NamedMDList) {
EXPECT_EQ(M->named_metadata_size(), 2u);
}

TEST(ModuleTest, GlobalList) {
// This tests all Module's functions that interact with Module::GlobalList.
LLVMContext C;
SMDiagnostic Err;
LLVMContext Context;
std::unique_ptr<Module> M = parseAssemblyString(R"(
@GV = external global i32
)",
Err, Context);
auto *GV = cast<GlobalVariable>(M->getNamedValue("GV"));
EXPECT_EQ(M->global_size(), 1u);
GlobalVariable *NewGV = new GlobalVariable(
Type::getInt32Ty(C), /*isConstant=*/true, GlobalValue::InternalLinkage,
/*Initializer=*/nullptr, "NewGV");
EXPECT_EQ(M->global_size(), 1u);
// Insert before
M->insertGlobalVariable(M->globals().begin(), NewGV);
EXPECT_EQ(M->global_size(), 2u);
EXPECT_EQ(&*M->globals().begin(), NewGV);
// Insert at end()
M->removeGlobalVariable(NewGV);
EXPECT_EQ(M->global_size(), 1u);
M->insertGlobalVariable(NewGV);
EXPECT_EQ(M->global_size(), 2u);
EXPECT_EQ(&*std::prev(M->globals().end()), NewGV);
// Check globals()
auto Range = M->globals();
EXPECT_EQ(&*Range.begin(), GV);
EXPECT_EQ(&*std::next(Range.begin()), NewGV);
EXPECT_EQ(std::next(Range.begin(), 2), Range.end());
// Check remove
M->removeGlobalVariable(NewGV);
EXPECT_EQ(M->global_size(), 1u);
// Check erase
M->insertGlobalVariable(NewGV);
M->eraseGlobalVariable(NewGV);
EXPECT_EQ(M->global_size(), 1u);
}

} // end namespace

0 comments on commit 823186b

Please sign in to comment.