aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/DwarfWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/DwarfWriter.cpp')
-rw-r--r--lib/CodeGen/DwarfWriter.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index 32079f2200..aa393f3678 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -1259,17 +1259,27 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
Unit->getDie()->AddChild(Die);
return Die;
}
-
+
// Check for pre-existence.
DIE *&Slot = Unit->getDieMapSlotFor(TyDesc);
if (Slot) return Slot;
+ // Type DIE result.
+ DIE *Ty = NULL;
+
+ // Short cut for handling subprogram types (not really a TyDesc.)
+ if (SubprogramDesc *SubprogramTy = dyn_cast<SubprogramDesc>(TyDesc)) {
+ Slot = Ty = new DIE(DW_TAG_pointer_type);
+ Ty->AddUInt(DW_AT_byte_size, 0, TAI->getAddressSize());
+ Ty->AddString(DW_AT_name, DW_FORM_string, SubprogramTy->getName());
+ Context->AddChild(Ty);
+ return Slot;
+ }
+
// Get core information.
const std::string &Name = TyDesc->getName();
uint64_t Size = TyDesc->getSize() >> 3;
- DIE *Ty = NULL;
-
if (BasicTypeDesc *BasicTy = dyn_cast<BasicTypeDesc>(TyDesc)) {
// Fundamental types like int, float, bool
Slot = Ty = new DIE(DW_TAG_base_type);
@@ -1526,14 +1536,8 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
}
default: break;
}
- } else if (SubprogramDesc *SubprogramTy = dyn_cast<SubprogramDesc>(TyDesc)) {
- Slot = Ty = new DIE(DW_TAG_pointer_type);
- Ty->AddUInt(DW_AT_byte_size, 0, TAI->getAddressSize());
- Ty->AddString(DW_AT_name, DW_FORM_string, SubprogramTy->getName());
- Context->AddChild(Ty);
- return Slot;
}
-
+
assert(Ty && "Type not supported yet");
// Add size if non-zero (derived types don't have a size.)