mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 05:22:04 +00:00
Debug Info: remove duplication of DIEs when a DIE is part of the type system
and it is shared across CUs. We add a few maps in DwarfDebug to map MDNodes for the type system to the corresponding DIEs: MDTypeNodeToDieMap, MDSPNodeToDieMap, and MDStaticMemberNodeToDieMap. These DIEs can be shared across CUs, that is why we keep the maps in DwarfDebug instead of CompileUnit. Sometimes, when we try to add an attribute to a DIE, the DIE is not yet added to its owner yet, so we don't know whether we should use ref_addr or ref4. We create a worklist that will be processed during finalization to add attributes with the correct form (ref_addr or ref4). We add addDIEEntry to DwarfDebug to be a wrapper around DIE->addValue. It checks whether we know the correct form, if not, we update the worklist (DIEEntryWorklist). A testing case is added to show that we only create a single DIE for a type MDNode and we use ref_addr to refer to the type DIE. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191792 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -113,13 +113,21 @@ DIE::~DIE() {
|
||||
/// Climb up the parent chain to get the compile unit DIE to which this DIE
|
||||
/// belongs.
|
||||
DIE *DIE::getCompileUnit() {
|
||||
DIE *Cu = checkCompileUnit();
|
||||
assert(Cu && "We should not have orphaned DIEs.");
|
||||
return Cu;
|
||||
}
|
||||
|
||||
/// Climb up the parent chain to get the compile unit DIE this DIE belongs
|
||||
/// to. Return NULL if DIE is not added to an owner yet.
|
||||
DIE *DIE::checkCompileUnit() {
|
||||
DIE *p = this;
|
||||
while (p) {
|
||||
if (p->getTag() == dwarf::DW_TAG_compile_unit)
|
||||
return p;
|
||||
p = p->getParent();
|
||||
}
|
||||
llvm_unreachable("We should not have orphaned DIEs.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DIEValue *DIE::findAttribute(uint16_t Attribute) {
|
||||
|
||||
Reference in New Issue
Block a user