mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-07 02:56:52 +00:00
DIBuilder: Now that DICompileUnit is distinct, stop using temporary nodes
for the arrays. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241308 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
516286ff69
commit
c3d9cd3f73
@ -36,14 +36,9 @@ namespace llvm {
|
||||
Module &M;
|
||||
LLVMContext &VMContext;
|
||||
|
||||
TempMDTuple TempEnumTypes;
|
||||
TempMDTuple TempRetainTypes;
|
||||
TempMDTuple TempSubprograms;
|
||||
TempMDTuple TempGVs;
|
||||
TempMDTuple TempImportedModules;
|
||||
|
||||
Function *DeclareFn; // llvm.dbg.declare
|
||||
Function *ValueFn; // llvm.dbg.value
|
||||
DICompileUnit *CUNode; ///< The one compile unit created by this DIBuiler.
|
||||
Function *DeclareFn; ///< llvm.dbg.declare
|
||||
Function *ValueFn; ///< llvm.dbg.value
|
||||
|
||||
SmallVector<Metadata *, 4> AllEnumTypes;
|
||||
/// Track the RetainTypes, since they can be updated later on.
|
||||
|
@ -1085,12 +1085,21 @@ public:
|
||||
/// deleted on a uniquing collision. In practice, uniquing collisions on \a
|
||||
/// DICompileUnit should be fairly rare.
|
||||
/// @{
|
||||
void replaceEnumTypes(DISubprogramArray N) {
|
||||
replaceOperandWith(4, N.get());
|
||||
}
|
||||
void replaceRetainedTypes(DISubprogramArray N) {
|
||||
replaceOperandWith(5, N.get());
|
||||
}
|
||||
void replaceSubprograms(DISubprogramArray N) {
|
||||
replaceOperandWith(6, N.get());
|
||||
}
|
||||
void replaceGlobalVariables(DIGlobalVariableArray N) {
|
||||
replaceOperandWith(7, N.get());
|
||||
}
|
||||
void replaceImportedEntities(DIGlobalVariableArray N) {
|
||||
replaceOperandWith(8, N.get());
|
||||
}
|
||||
/// @}
|
||||
|
||||
static bool classof(const Metadata *MD) {
|
||||
|
@ -58,8 +58,7 @@ public:
|
||||
}
|
||||
|
||||
DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
|
||||
: M(m), VMContext(M.getContext()), TempEnumTypes(nullptr),
|
||||
TempRetainTypes(nullptr), TempSubprograms(nullptr), TempGVs(nullptr),
|
||||
: M(m), VMContext(M.getContext()), CUNode(nullptr),
|
||||
DeclareFn(nullptr), ValueFn(nullptr),
|
||||
AllowUnresolvedNodes(AllowUnresolvedNodes) {}
|
||||
|
||||
@ -74,7 +73,8 @@ void DIBuilder::trackIfUnresolved(MDNode *N) {
|
||||
}
|
||||
|
||||
void DIBuilder::finalize() {
|
||||
TempEnumTypes->replaceAllUsesWith(MDTuple::get(VMContext, AllEnumTypes));
|
||||
if (CUNode) {
|
||||
CUNode->replaceEnumTypes(MDTuple::get(VMContext, AllEnumTypes));
|
||||
|
||||
SmallVector<Metadata *, 16> RetainValues;
|
||||
// Declarations and definitions of the same type may be retained. Some
|
||||
@ -85,10 +85,10 @@ void DIBuilder::finalize() {
|
||||
for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
|
||||
if (RetainSet.insert(AllRetainTypes[I]).second)
|
||||
RetainValues.push_back(AllRetainTypes[I]);
|
||||
TempRetainTypes->replaceAllUsesWith(MDTuple::get(VMContext, RetainValues));
|
||||
CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
|
||||
|
||||
DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
|
||||
TempSubprograms->replaceAllUsesWith(SPs.get());
|
||||
CUNode->replaceSubprograms(SPs.get());
|
||||
for (auto *SP : SPs) {
|
||||
if (MDTuple *Temp = SP->getVariables().get()) {
|
||||
const auto &PV = PreservedVariables.lookup(SP);
|
||||
@ -98,11 +98,12 @@ void DIBuilder::finalize() {
|
||||
}
|
||||
}
|
||||
|
||||
TempGVs->replaceAllUsesWith(MDTuple::get(VMContext, AllGVs));
|
||||
CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
|
||||
|
||||
TempImportedModules->replaceAllUsesWith(MDTuple::get(
|
||||
CUNode->replaceImportedEntities(MDTuple::get(
|
||||
VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
|
||||
AllImportedModules.end())));
|
||||
}
|
||||
|
||||
// Now that all temp nodes have been replaced or deleted, resolve remaining
|
||||
// cycles.
|
||||
@ -133,19 +134,11 @@ DICompileUnit *DIBuilder::createCompileUnit(
|
||||
assert(!Filename.empty() &&
|
||||
"Unable to create compile unit without filename");
|
||||
|
||||
// TODO: Once we make DICompileUnit distinct, stop using temporaries here
|
||||
// (just start with operands assigned to nullptr).
|
||||
TempEnumTypes = MDTuple::getTemporary(VMContext, None);
|
||||
TempRetainTypes = MDTuple::getTemporary(VMContext, None);
|
||||
TempSubprograms = MDTuple::getTemporary(VMContext, None);
|
||||
TempGVs = MDTuple::getTemporary(VMContext, None);
|
||||
TempImportedModules = MDTuple::getTemporary(VMContext, None);
|
||||
|
||||
DICompileUnit *CUNode = DICompileUnit::getDistinct(
|
||||
assert(!CUNode && "Can only make one compile unit per DIBuilder instance");
|
||||
CUNode = DICompileUnit::getDistinct(
|
||||
VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
|
||||
isOptimized, Flags, RunTimeVer, SplitName, Kind, TempEnumTypes.get(),
|
||||
TempRetainTypes.get(), TempSubprograms.get(), TempGVs.get(),
|
||||
TempImportedModules.get(), DWOId);
|
||||
isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, DWOId);
|
||||
|
||||
// Create a named metadata so that it is easier to find cu in a module.
|
||||
// Note that we only generate this when the caller wants to actually
|
||||
|
Loading…
x
Reference in New Issue
Block a user