summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Analysis/DebugInfo.h10
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp19
-rw-r--r--llvm/test/DebugInfo/forwardDecl.ll1
3 files changed, 18 insertions, 12 deletions
diff --git a/llvm/include/llvm/Analysis/DebugInfo.h b/llvm/include/llvm/Analysis/DebugInfo.h
index 3f9f984f41d..41095514815 100644
--- a/llvm/include/llvm/Analysis/DebugInfo.h
+++ b/llvm/include/llvm/Analysis/DebugInfo.h
@@ -129,6 +129,13 @@ namespace llvm {
/// FIXME: Types should be factored much better so that CV qualifiers and
/// others do not require a huge and empty descriptor full of zeros.
class DIType : public DIDescriptor {
+ public:
+ enum {
+ FlagPrivate = 1 << 0,
+ FlagProtected = 1 << 1,
+ FlagFwdDecl = 1 << 2
+ };
+
protected:
DIType(GlobalVariable *GV, unsigned Tag) : DIDescriptor(GV, Tag) {}
// This ctor is used when the Tag has already been validated by a derived
@@ -167,6 +174,9 @@ namespace llvm {
// carry this is just plain insane.
uint64_t getOffsetInBits() const { return getUInt64Field(7); }
unsigned getFlags() const { return getUnsignedField(8); }
+ bool isPrivate() const { return (getFlags() & FlagPrivate) != 0; }
+ bool isProtected() const { return (getFlags() & FlagProtected) != 0; }
+ bool isForwardDecl() const { return (getFlags() & FlagFwdDecl) != 0; }
virtual std::string getFilename() const {
assert (0 && "Invalid DIDescriptor");
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
index dccd59c8720..a2934bd8c75 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
@@ -1820,19 +1820,16 @@ private:
if (Size)
AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
else {
- // Add zero size even if it is not a forward declaration.
- // FIXME - Enable this.
- // if (!CTy.isDefinition())
- // AddUInt(&Buffer, DW_AT_declaration, DW_FORM_flag, 1);
- // else
- // AddUInt(&Buffer, DW_AT_byte_size, 0, 0);
+ // Add zero size if it is not a forward declaration.
+ if (CTy.isForwardDecl())
+ AddUInt(&Buffer, DW_AT_declaration, DW_FORM_flag, 1);
+ else
+ AddUInt(&Buffer, DW_AT_byte_size, 0, 0);
}
- // Add source line info if available and TyDesc is not a forward
- // declaration.
- // FIXME - Enable this.
- // if (CTy.isForwardDecl())
- // AddSourceLine(&Buffer, *CTy);
+ // Add source line info if available.
+ if (!CTy.isForwardDecl())
+ AddSourceLine(&Buffer, &CTy);
}
// ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
diff --git a/llvm/test/DebugInfo/forwardDecl.ll b/llvm/test/DebugInfo/forwardDecl.ll
index cf0923edae9..a8bb9fffd0b 100644
--- a/llvm/test/DebugInfo/forwardDecl.ll
+++ b/llvm/test/DebugInfo/forwardDecl.ll
@@ -1,5 +1,4 @@
; RUN: llvm-as < %s | llc | %prcontext ST 1 | grep 0x1 | count 1
-; XFAIL: *
target triple = "i386-apple-darwin9.6"
%llvm.dbg.anchor.type = type { i32, i32 }
OpenPOWER on IntegriCloud