[llvm] r176838 - Remove support for versioned debug info.
David Blaikie
dblaikie at gmail.com
Tue Mar 12 15:39:03 PDT 2013
On Tue, Mar 12, 2013 at 3:30 PM, David Dean <david_dean at apple.com> wrote:
> I'm seeing some of the debug-info tests from http://llvm.org/svn/llvm-project/debuginfo-tests/ failing after this change. Could you please update the tests?
Where can I view those results or read steps to reproduce them?
>
> On 11 Mar 2013, at 4:39 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> Author: dblaikie
>> Date: Mon Mar 11 18:39:23 2013
>> New Revision: 176838
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=176838&view=rev
>> Log:
>> Remove support for versioned debug info.
>>
>> Versioned debug info support has been a burden to maintain & also compromised
>> current debug info verification by causing test cases testing old debug info to
>> remain rather than being updated to the latest. It also makes it hard to add or
>> change the metadata schema by requiring various backwards-compatibility in the
>> DI* hierarchy.
>>
>> So it's being removed in preparation for new changes to the schema to tidy up
>> old/unnecessary fields and add new fields needed for new debug info (well, new
>> to LLVM at least).
>>
>> The more surprising part of this is the changes to DI*::Verify - this became
>> necessary due to the changes to AsmWriter. AsmWriter was relying on the version
>> test to decide which bits of metadata were actually debug info when printing
>> the comment annotations. Without the version information the tag numbers were
>> too common & it would print debug info on random metadata that happened to
>> start with an integer that matched a tag number. Instead this change makes the
>> Verify functions more precise (just adding "number of operands" checks - not
>> type checking those operands yet) & relies on that to decide which metadata is
>> debug info metadata.
>>
>> Modified:
>> llvm/trunk/include/llvm/DebugInfo.h
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> llvm/trunk/lib/IR/AsmWriter.cpp
>> llvm/trunk/lib/IR/DebugInfo.cpp
>>
>> Modified: llvm/trunk/include/llvm/DebugInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo.h?rev=176838&r1=176837&r2=176838&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DebugInfo.h (original)
>> +++ llvm/trunk/include/llvm/DebugInfo.h Mon Mar 11 18:39:23 2013
>> @@ -96,15 +96,11 @@ namespace llvm {
>> explicit DIDescriptor(const DIVariable F);
>> explicit DIDescriptor(const DIType F);
>>
>> - bool Verify() const { return DbgNode != 0; }
>> + bool Verify() const;
>>
>> operator MDNode *() const { return const_cast<MDNode*>(DbgNode); }
>> MDNode *operator ->() const { return const_cast<MDNode*>(DbgNode); }
>>
>> - unsigned getVersion() const {
>> - return getUnsignedField(0) & LLVMDebugVersionMask;
>> - }
>> -
>> unsigned getTag() const {
>> return getUnsignedField(0) & ~LLVMDebugVersionMask;
>> }
>> @@ -146,6 +142,7 @@ namespace llvm {
>>
>> int64_t getLo() const { return getInt64Field(1); }
>> int64_t getCount() const { return getInt64Field(2); }
>> + bool Verify() const;
>> };
>>
>> /// DIArray - This descriptor holds an array of descriptors.
>> @@ -220,10 +217,7 @@ namespace llvm {
>> }
>> StringRef getFilename() const { return getStringField(1); }
>> StringRef getDirectory() const { return getStringField(2); }
>> - DICompileUnit getCompileUnit() const{
>> - assert (getVersion() <= LLVMDebugVersion10 && "Invalid CompileUnit!");
>> - return getFieldAs<DICompileUnit>(3);
>> - }
>> + bool Verify() const;
>> };
>>
>> /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}').
>> @@ -237,6 +231,7 @@ namespace llvm {
>>
>> StringRef getName() const { return getStringField(1); }
>> uint64_t getEnumValue() const { return getUInt64Field(2); }
>> + bool Verify() const;
>> };
>>
>> /// DIType - This is a wrapper for a type.
>> @@ -257,13 +252,6 @@ namespace llvm {
>>
>> DIScope getContext() const { return getFieldAs<DIScope>(1); }
>> StringRef getName() const { return getStringField(2); }
>> - DICompileUnit getCompileUnit() const{
>> - assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getFieldAs<DICompileUnit>(3);
>> -
>> - return getFieldAs<DIFile>(3).getCompileUnit();
>> - }
>> DIFile getFile() const { return getFieldAs<DIFile>(3); }
>> unsigned getLineNumber() const { return getUnsignedField(4); }
>> uint64_t getSizeInBits() const { return getUInt64Field(5); }
>> @@ -310,15 +298,9 @@ namespace llvm {
>> return DbgNode && (isBasicType() || isDerivedType() || isCompositeType());
>> }
>> StringRef getDirectory() const {
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getCompileUnit().getDirectory();
>> -
>> return getFieldAs<DIFile>(3).getDirectory();
>> }
>> StringRef getFilename() const {
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getCompileUnit().getFilename();
>> -
>> return getFieldAs<DIFile>(3).getFilename();
>> }
>>
>> @@ -375,44 +357,6 @@ namespace llvm {
>> return getConstantField(10);
>> }
>>
>> - StringRef getObjCPropertyName() const {
>> - if (getVersion() > LLVMDebugVersion11)
>> - return StringRef();
>> - return getStringField(10);
>> - }
>> - StringRef getObjCPropertyGetterName() const {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return getStringField(11);
>> - }
>> - StringRef getObjCPropertySetterName() const {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return getStringField(12);
>> - }
>> - bool isReadOnlyObjCProperty() {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_readonly) != 0;
>> - }
>> - bool isReadWriteObjCProperty() {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_readwrite) != 0;
>> - }
>> - bool isAssignObjCProperty() {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_assign) != 0;
>> - }
>> - bool isRetainObjCProperty() {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_retain) != 0;
>> - }
>> - bool isCopyObjCProperty() {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_copy) != 0;
>> - }
>> - bool isNonAtomicObjCProperty() {
>> - assert (getVersion() <= LLVMDebugVersion11 && "Invalid Request");
>> - return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_nonatomic) != 0;
>> - }
>> -
>> /// Verify - Verify that a derived type descriptor is well formed.
>> bool Verify() const;
>> };
>> @@ -457,6 +401,7 @@ namespace llvm {
>> }
>> unsigned getLineNumber() const { return getUnsignedField(5); }
>> unsigned getColumnNumber() const { return getUnsignedField(6); }
>> + bool Verify() const;
>> };
>>
>> /// DITemplateValueParameter - This is a wrapper for template value parameter.
>> @@ -476,6 +421,7 @@ namespace llvm {
>> }
>> unsigned getLineNumber() const { return getUnsignedField(6); }
>> unsigned getColumnNumber() const { return getUnsignedField(7); }
>> + bool Verify() const;
>> };
>>
>> /// DISubprogram - This is a wrapper for a subprogram (e.g. a function).
>> @@ -489,13 +435,6 @@ namespace llvm {
>> StringRef getName() const { return getStringField(3); }
>> StringRef getDisplayName() const { return getStringField(4); }
>> StringRef getLinkageName() const { return getStringField(5); }
>> - DICompileUnit getCompileUnit() const{
>> - assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getFieldAs<DICompileUnit>(6);
>> -
>> - return getFieldAs<DIFile>(6).getCompileUnit();
>> - }
>> unsigned getLineNumber() const { return getUnsignedField(7); }
>> DICompositeType getType() const { return getFieldAs<DICompositeType>(8); }
>>
>> @@ -529,50 +468,34 @@ namespace llvm {
>> }
>>
>> unsigned isArtificial() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return getUnsignedField(14);
>> return (getUnsignedField(14) & FlagArtificial) != 0;
>> }
>> /// isPrivate - Return true if this subprogram has "private"
>> /// access specifier.
>> bool isPrivate() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return false;
>> return (getUnsignedField(14) & FlagPrivate) != 0;
>> }
>> /// isProtected - Return true if this subprogram has "protected"
>> /// access specifier.
>> bool isProtected() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return false;
>> return (getUnsignedField(14) & FlagProtected) != 0;
>> }
>> /// isExplicit - Return true if this subprogram is marked as explicit.
>> bool isExplicit() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return false;
>> return (getUnsignedField(14) & FlagExplicit) != 0;
>> }
>> /// isPrototyped - Return true if this subprogram is prototyped.
>> bool isPrototyped() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return false;
>> return (getUnsignedField(14) & FlagPrototyped) != 0;
>> }
>>
>> unsigned isOptimized() const;
>>
>> StringRef getFilename() const {
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getCompileUnit().getFilename();
>> -
>> return getFieldAs<DIFile>(6).getFilename();
>> }
>>
>> StringRef getDirectory() const {
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getCompileUnit().getFilename();
>> -
>> return getFieldAs<DIFile>(6).getDirectory();
>> }
>>
>> @@ -613,22 +536,10 @@ namespace llvm {
>> StringRef getName() const { return getStringField(3); }
>> StringRef getDisplayName() const { return getStringField(4); }
>> StringRef getLinkageName() const { return getStringField(5); }
>> - DICompileUnit getCompileUnit() const{
>> - assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getFieldAs<DICompileUnit>(6);
>> -
>> - DIFile F = getFieldAs<DIFile>(6);
>> - return F.getCompileUnit();
>> - }
>> StringRef getFilename() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion10)
>> - return getContext().getFilename();
>> return getFieldAs<DIFile>(6).getFilename();
>> }
>> StringRef getDirectory() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion10)
>> - return getContext().getDirectory();
>> return getFieldAs<DIFile>(6).getDirectory();
>>
>> }
>> @@ -659,14 +570,6 @@ namespace llvm {
>>
>> DIScope getContext() const { return getFieldAs<DIScope>(1); }
>> StringRef getName() const { return getStringField(2); }
>> - DICompileUnit getCompileUnit() const {
>> - assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getFieldAs<DICompileUnit>(3);
>> -
>> - DIFile F = getFieldAs<DIFile>(3);
>> - return F.getCompileUnit();
>> - }
>> DIFile getFile() const { return getFieldAs<DIFile>(3); }
>> unsigned getLineNumber() const {
>> return (getUnsignedField(4) << 8) >> 8;
>> @@ -679,8 +582,6 @@ namespace llvm {
>>
>> /// isArtificial - Return true if this variable is marked as "artificial".
>> bool isArtificial() const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return false;
>> return (getUnsignedField(6) & FlagArtificial) != 0;
>> }
>>
>> @@ -702,10 +603,6 @@ namespace llvm {
>> unsigned getNumAddrElements() const;
>>
>> uint64_t getAddrElement(unsigned Idx) const {
>> - if (getVersion() <= llvm::LLVMDebugVersion8)
>> - return getUInt64Field(Idx+6);
>> - if (getVersion() == llvm::LLVMDebugVersion9)
>> - return getUInt64Field(Idx+7);
>> return getUInt64Field(Idx+8);
>> }
>>
>> @@ -737,6 +634,7 @@ namespace llvm {
>> StringRef filename = getFieldAs<DIFile>(4).getFilename();
>> return !filename.empty() ? filename : getContext().getFilename();
>> }
>> + bool Verify() const;
>> };
>>
>> /// DILexicalBlockFile - This is a wrapper for a lexical block with
>> @@ -757,6 +655,7 @@ namespace llvm {
>> return filename;
>> }
>> DILexicalBlock getScope() const { return getFieldAs<DILexicalBlock>(1); }
>> + bool Verify() const;
>> };
>>
>> /// DINameSpace - A wrapper for a C++ style name space.
>> @@ -771,13 +670,6 @@ namespace llvm {
>> StringRef getFilename() const {
>> return getFieldAs<DIFile>(3).getFilename();
>> }
>> - DICompileUnit getCompileUnit() const{
>> - assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
>> - if (getVersion() == llvm::LLVMDebugVersion7)
>> - return getFieldAs<DICompileUnit>(3);
>> -
>> - return getFieldAs<DIFile>(3).getCompileUnit();
>> - }
>> unsigned getLineNumber() const { return getUnsignedField(4); }
>> bool Verify() const;
>> };
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=176838&r1=176837&r2=176838&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Mar 11 18:39:23 2013
>> @@ -1672,33 +1672,6 @@ DIE *CompileUnit::createMemberDIE(DIDeri
>> if (DT.isArtificial())
>> addFlag(MemberDie, dwarf::DW_AT_artificial);
>>
>> - // This is only for backward compatibility.
>> - StringRef PropertyName = DT.getObjCPropertyName();
>> - if (!PropertyName.empty()) {
>> - addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
>> - StringRef GetterName = DT.getObjCPropertyGetterName();
>> - if (!GetterName.empty())
>> - addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
>> - StringRef SetterName = DT.getObjCPropertySetterName();
>> - if (!SetterName.empty())
>> - addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
>> - unsigned PropertyAttributes = 0;
>> - if (DT.isReadOnlyObjCProperty())
>> - PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
>> - if (DT.isReadWriteObjCProperty())
>> - PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
>> - if (DT.isAssignObjCProperty())
>> - PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
>> - if (DT.isRetainObjCProperty())
>> - PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
>> - if (DT.isCopyObjCProperty())
>> - PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
>> - if (DT.isNonAtomicObjCProperty())
>> - PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
>> - if (PropertyAttributes)
>> - addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
>> - PropertyAttributes);
>> - }
>> return MemberDie;
>> }
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=176838&r1=176837&r2=176838&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Mar 11 18:39:23 2013
>> @@ -756,82 +756,6 @@ void DwarfDebug::constructSubprogramDIE(
>> TheCU->addGlobalName(SP.getName(), SubprogramDie);
>> }
>>
>> -// Collect debug info from named mdnodes such as llvm.dbg.enum and llvm.dbg.ty.
>> -void DwarfDebug::collectInfoFromNamedMDNodes(const Module *M) {
>> - if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
>> - for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> - const MDNode *N = NMD->getOperand(i);
>> - if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
>> - constructSubprogramDIE(CU, N);
>> - }
>> -
>> - if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
>> - for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> - const MDNode *N = NMD->getOperand(i);
>> - if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
>> - CU->createGlobalVariableDIE(N);
>> - }
>> -
>> - if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
>> - for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> - DIType Ty(NMD->getOperand(i));
>> - if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
>> - CU->getOrCreateTypeDIE(Ty);
>> - }
>> -
>> - if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
>> - for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> - DIType Ty(NMD->getOperand(i));
>> - if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
>> - CU->getOrCreateTypeDIE(Ty);
>> - }
>> -}
>> -
>> -// Collect debug info using DebugInfoFinder.
>> -// FIXME - Remove this when dragonegg switches to DIBuilder.
>> -bool DwarfDebug::collectLegacyDebugInfo(const Module *M) {
>> - DebugInfoFinder DbgFinder;
>> - DbgFinder.processModule(*M);
>> -
>> - bool HasDebugInfo = false;
>> - // Scan all the compile-units to see if there are any marked as the main
>> - // unit. If not, we do not generate debug info.
>> - for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
>> - E = DbgFinder.compile_unit_end(); I != E; ++I) {
>> - if (DICompileUnit(*I).isMain()) {
>> - HasDebugInfo = true;
>> - break;
>> - }
>> - }
>> - if (!HasDebugInfo) return false;
>> -
>> - // Emit initial sections so we can refer to them later.
>> - emitSectionLabels();
>> -
>> - // Create all the compile unit DIEs.
>> - for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
>> - E = DbgFinder.compile_unit_end(); I != E; ++I)
>> - constructCompileUnit(*I);
>> -
>> - // Create DIEs for each global variable.
>> - for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
>> - E = DbgFinder.global_variable_end(); I != E; ++I) {
>> - const MDNode *N = *I;
>> - if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
>> - CU->createGlobalVariableDIE(N);
>> - }
>> -
>> - // Create DIEs for each subprogram.
>> - for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
>> - E = DbgFinder.subprogram_end(); I != E; ++I) {
>> - const MDNode *N = *I;
>> - if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
>> - constructSubprogramDIE(CU, N);
>> - }
>> -
>> - return HasDebugInfo;
>> -}
>> -
>> // Emit all Dwarf sections that should come prior to the content. Create
>> // global DIEs and emit initial debug info sections. This is invoked by
>> // the target AsmPrinter.
>> @@ -844,30 +768,28 @@ void DwarfDebug::beginModule() {
>> // If module has named metadata anchors then use them, otherwise scan the
>> // module using debug info finder to collect debug info.
>> NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
>> - if (CU_Nodes) {
>> - // Emit initial sections so we can reference labels later.
>> - emitSectionLabels();
>> -
>> - for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
>> - DICompileUnit CUNode(CU_Nodes->getOperand(i));
>> - CompileUnit *CU = constructCompileUnit(CUNode);
>> - DIArray GVs = CUNode.getGlobalVariables();
>> - for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
>> - CU->createGlobalVariableDIE(GVs.getElement(i));
>> - DIArray SPs = CUNode.getSubprograms();
>> - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
>> - constructSubprogramDIE(CU, SPs.getElement(i));
>> - DIArray EnumTypes = CUNode.getEnumTypes();
>> - for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
>> - CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
>> - DIArray RetainedTypes = CUNode.getRetainedTypes();
>> - for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
>> - CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
>> - }
>> - } else if (!collectLegacyDebugInfo(M))
>> + if (!CU_Nodes)
>> return;
>>
>> - collectInfoFromNamedMDNodes(M);
>> + // Emit initial sections so we can reference labels later.
>> + emitSectionLabels();
>> +
>> + for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
>> + DICompileUnit CUNode(CU_Nodes->getOperand(i));
>> + CompileUnit *CU = constructCompileUnit(CUNode);
>> + DIArray GVs = CUNode.getGlobalVariables();
>> + for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
>> + CU->createGlobalVariableDIE(GVs.getElement(i));
>> + DIArray SPs = CUNode.getSubprograms();
>> + for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
>> + constructSubprogramDIE(CU, SPs.getElement(i));
>> + DIArray EnumTypes = CUNode.getEnumTypes();
>> + for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
>> + CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
>> + DIArray RetainedTypes = CUNode.getRetainedTypes();
>> + for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
>> + CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
>> + }
>>
>> // Tell MMI that we have debug info.
>> MMI->setDebugInfoAvailability(true);
>> @@ -1211,16 +1133,10 @@ DwarfDebug::collectVariableInfo(const Ma
>> if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
>> DISubprogram(DV.getContext()).describes(MF->getFunction()))
>> Scope = LScopes.getCurrentFunctionScope();
>> - else {
>> - if (DV.getVersion() <= LLVMDebugVersion9)
>> - Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
>> - else {
>> - if (MDNode *IA = DV.getInlinedAt())
>> - Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
>> - else
>> - Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
>> - }
>> - }
>> + else if (MDNode *IA = DV.getInlinedAt())
>> + Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
>> + else
>> + Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
>> // If variable scope is not found then skip this variable.
>> if (!Scope)
>> continue;
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=176838&r1=176837&r2=176838&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Mon Mar 11 18:39:23 2013
>> @@ -598,14 +598,6 @@ public:
>> DwarfDebug(AsmPrinter *A, Module *M);
>> ~DwarfDebug();
>>
>> - /// \brief Collect debug info from named mdnodes such as llvm.dbg.enum
>> - /// and llvm.dbg.ty
>> - void collectInfoFromNamedMDNodes(const Module *M);
>> -
>> - /// \brief Collect debug info using DebugInfoFinder.
>> - /// FIXME - Remove this when DragonEgg switches to DIBuilder.
>> - bool collectLegacyDebugInfo(const Module *M);
>> -
>> /// \brief Emit all Dwarf sections that should come prior to the
>> /// content.
>> void beginModule();
>>
>> Modified: llvm/trunk/lib/IR/AsmWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=176838&r1=176837&r2=176838&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/IR/AsmWriter.cpp (original)
>> +++ llvm/trunk/lib/IR/AsmWriter.cpp Mon Mar 11 18:39:23 2013
>> @@ -2094,7 +2094,7 @@ static void WriteMDNodeComment(const MDN
>> return;
>>
>> DIDescriptor Desc(Node);
>> - if (Desc.getVersion() < LLVMDebugVersion11)
>> + if (!Desc.Verify())
>> return;
>>
>> unsigned Tag = Desc.getTag();
>>
>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=176838&r1=176837&r2=176838&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Mar 11 18:39:23 2013
>> @@ -51,6 +51,21 @@ DIDescriptor::DIDescriptor(const DIVaria
>> DIDescriptor::DIDescriptor(const DIType F) : DbgNode(F.DbgNode) {
>> }
>>
>> +bool DIDescriptor::Verify() const {
>> + return DbgNode &&
>> + (DIDerivedType(DbgNode).Verify() ||
>> + DICompositeType(DbgNode).Verify() || DIBasicType(DbgNode).Verify() ||
>> + DIVariable(DbgNode).Verify() || DISubprogram(DbgNode).Verify() ||
>> + DIGlobalVariable(DbgNode).Verify() || DIFile(DbgNode).Verify() ||
>> + DICompileUnit(DbgNode).Verify() || DINameSpace(DbgNode).Verify() ||
>> + DILexicalBlock(DbgNode).Verify() ||
>> + DILexicalBlockFile(DbgNode).Verify() ||
>> + DISubrange(DbgNode).Verify() || DIEnumerator(DbgNode).Verify() ||
>> + DIObjCProperty(DbgNode).Verify() ||
>> + DITemplateTypeParameter(DbgNode).Verify() ||
>> + DITemplateValueParameter(DbgNode).Verify());
>> +}
>> +
>> StringRef
>> DIDescriptor::getStringField(unsigned Elt) const {
>> if (DbgNode == 0)
>> @@ -135,17 +150,11 @@ void DIDescriptor::replaceFunctionField(
>> }
>>
>> unsigned DIVariable::getNumAddrElements() const {
>> - if (getVersion() <= LLVMDebugVersion8)
>> - return DbgNode->getNumOperands()-6;
>> - if (getVersion() == LLVMDebugVersion9)
>> - return DbgNode->getNumOperands()-7;
>> return DbgNode->getNumOperands()-8;
>> }
>>
>> /// getInlinedAt - If this variable is inlined then return inline location.
>> MDNode *DIVariable::getInlinedAt() const {
>> - if (getVersion() <= LLVMDebugVersion9)
>> - return NULL;
>> return dyn_cast_or_null<MDNode>(DbgNode->getOperand(7));
>> }
>>
>> @@ -392,31 +401,30 @@ bool DIType::isUnsignedDIType() {
>>
>> /// Verify - Verify that a compile unit is well formed.
>> bool DICompileUnit::Verify() const {
>> - if (!DbgNode)
>> + if (!isCompileUnit())
>> return false;
>> StringRef N = getFilename();
>> if (N.empty())
>> return false;
>> // It is possible that directory and produce string is empty.
>> - return true;
>> + return DbgNode->getNumOperands() == 15;
>> }
>>
>> /// Verify - Verify that an ObjC property is well formed.
>> bool DIObjCProperty::Verify() const {
>> - if (!DbgNode)
>> + if (!isObjCProperty())
>> return false;
>> - unsigned Tag = getTag();
>> - if (Tag != dwarf::DW_TAG_APPLE_property) return false;
>> +
>> DIType Ty = getType();
>> if (!Ty.Verify()) return false;
>>
>> // Don't worry about the rest of the strings for now.
>> - return true;
>> + return DbgNode->getNumOperands() == 8;
>> }
>>
>> /// Verify - Verify that a type descriptor is well formed.
>> bool DIType::Verify() const {
>> - if (!DbgNode)
>> + if (!isType())
>> return false;
>> if (getContext() && !getContext().Verify())
>> return false;
>> @@ -437,27 +445,28 @@ bool DIType::Verify() const {
>>
>> /// Verify - Verify that a basic type descriptor is well formed.
>> bool DIBasicType::Verify() const {
>> - return isBasicType();
>> + return isBasicType() && DbgNode->getNumOperands() == 10;
>> }
>>
>> /// Verify - Verify that a derived type descriptor is well formed.
>> bool DIDerivedType::Verify() const {
>> - return isDerivedType();
>> + return isDerivedType() && DbgNode->getNumOperands() >= 10 &&
>> + DbgNode->getNumOperands() <= 14;
>> }
>>
>> /// Verify - Verify that a composite type descriptor is well formed.
>> bool DICompositeType::Verify() const {
>> - if (!DbgNode)
>> + if (!isCompositeType())
>> return false;
>> if (getContext() && !getContext().Verify())
>> return false;
>>
>> - return true;
>> + return DbgNode->getNumOperands() >= 10 && DbgNode->getNumOperands() <= 14;
>> }
>>
>> /// Verify - Verify that a subprogram descriptor is well formed.
>> bool DISubprogram::Verify() const {
>> - if (!DbgNode)
>> + if (!isSubprogram())
>> return false;
>>
>> if (getContext() && !getContext().Verify())
>> @@ -466,12 +475,12 @@ bool DISubprogram::Verify() const {
>> DICompositeType Ty = getType();
>> if (!Ty.Verify())
>> return false;
>> - return true;
>> + return DbgNode->getNumOperands() == 21;
>> }
>>
>> /// Verify - Verify that a global variable descriptor is well formed.
>> bool DIGlobalVariable::Verify() const {
>> - if (!DbgNode)
>> + if (!isGlobalVariable())
>> return false;
>>
>> if (getDisplayName().empty())
>> @@ -487,12 +496,12 @@ bool DIGlobalVariable::Verify() const {
>> if (!getGlobal() && !getConstant())
>> return false;
>>
>> - return true;
>> + return DbgNode->getNumOperands() == 13;
>> }
>>
>> /// Verify - Verify that a variable descriptor is well formed.
>> bool DIVariable::Verify() const {
>> - if (!DbgNode)
>> + if (!isVariable())
>> return false;
>>
>> if (getContext() && !getContext().Verify())
>> @@ -502,7 +511,7 @@ bool DIVariable::Verify() const {
>> if (!Ty.Verify())
>> return false;
>>
>> - return true;
>> + return DbgNode->getNumOperands() >= 8;
>> }
>>
>> /// Verify - Verify that a location descriptor is well formed.
>> @@ -515,9 +524,44 @@ bool DILocation::Verify() const {
>>
>> /// Verify - Verify that a namespace descriptor is well formed.
>> bool DINameSpace::Verify() const {
>> - if (!DbgNode)
>> + if (!isNameSpace())
>> return false;
>> - return true;
>> + return DbgNode->getNumOperands() == 5;
>> +}
>> +
>> +/// \brief Verify that the file descriptor is well formed.
>> +bool DIFile::Verify() const {
>> + return isFile() && DbgNode->getNumOperands() == 4;
>> +}
>> +
>> +/// \brief Verify that the enumerator descriptor is well formed.
>> +bool DIEnumerator::Verify() const {
>> + return isEnumerator() && DbgNode->getNumOperands() == 3;
>> +}
>> +
>> +/// \brief Verify that the subrange descriptor is well formed.
>> +bool DISubrange::Verify() const {
>> + return isSubrange() && DbgNode->getNumOperands() == 3;
>> +}
>> +
>> +/// \brief Verify that the lexical block descriptor is well formed.
>> +bool DILexicalBlock::Verify() const {
>> + return isLexicalBlock() && DbgNode->getNumOperands() == 6;
>> +}
>> +
>> +/// \brief Verify that the file-scoped lexical block descriptor is well formed.
>> +bool DILexicalBlockFile::Verify() const {
>> + return isLexicalBlockFile() && DbgNode->getNumOperands() == 3;
>> +}
>> +
>> +/// \brief Verify that the template type parameter descriptor is well formed.
>> +bool DITemplateTypeParameter::Verify() const {
>> + return isTemplateTypeParameter() && DbgNode->getNumOperands() == 7;
>> +}
>> +
>> +/// \brief Verify that the template value parameter descriptor is well formed.
>> +bool DITemplateValueParameter::Verify() const {
>> + return isTemplateValueParameter() && DbgNode->getNumOperands() == 8;
>> }
>>
>> /// getOriginalTypeSize - If this type is derived from a base type then
>> @@ -551,7 +595,7 @@ uint64_t DIDerivedType::getOriginalTypeS
>>
>> /// getObjCProperty - Return property node, if this ivar is associated with one.
>> MDNode *DIDerivedType::getObjCProperty() const {
>> - if (getVersion() <= LLVMDebugVersion11 || DbgNode->getNumOperands() <= 10)
>> + if (DbgNode->getNumOperands() <= 10)
>> return NULL;
>> return dyn_cast_or_null<MDNode>(DbgNode->getOperand(10));
>> }
>> @@ -803,71 +847,25 @@ void DebugInfoFinder::processModule(cons
>> for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
>> DICompileUnit CU(CU_Nodes->getOperand(i));
>> addCompileUnit(CU);
>> - if (CU.getVersion() > LLVMDebugVersion10) {
>> - DIArray GVs = CU.getGlobalVariables();
>> - for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
>> - DIGlobalVariable DIG(GVs.getElement(i));
>> - if (addGlobalVariable(DIG))
>> - processType(DIG.getType());
>> - }
>> - DIArray SPs = CU.getSubprograms();
>> - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
>> - processSubprogram(DISubprogram(SPs.getElement(i)));
>> - DIArray EnumTypes = CU.getEnumTypes();
>> - for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
>> - processType(DIType(EnumTypes.getElement(i)));
>> - DIArray RetainedTypes = CU.getRetainedTypes();
>> - for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
>> - processType(DIType(RetainedTypes.getElement(i)));
>> - return;
>> - }
>> - }
>> - }
>> -
>> - for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I)
>> - for (Function::const_iterator FI = (*I).begin(), FE = (*I).end();
>> - FI != FE; ++FI)
>> - for (BasicBlock::const_iterator BI = (*FI).begin(), BE = (*FI).end();
>> - BI != BE; ++BI) {
>> - if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
>> - processDeclare(DDI);
>> -
>> - DebugLoc Loc = BI->getDebugLoc();
>> - if (Loc.isUnknown())
>> - continue;
>> -
>> - LLVMContext &Ctx = BI->getContext();
>> - DIDescriptor Scope(Loc.getScope(Ctx));
>> -
>> - if (Scope.isCompileUnit())
>> - addCompileUnit(DICompileUnit(Scope));
>> - else if (Scope.isSubprogram())
>> - processSubprogram(DISubprogram(Scope));
>> - else if (Scope.isLexicalBlockFile()) {
>> - DILexicalBlockFile DBF = DILexicalBlockFile(Scope);
>> - processLexicalBlock(DILexicalBlock(DBF.getScope()));
>> - }
>> - else if (Scope.isLexicalBlock())
>> - processLexicalBlock(DILexicalBlock(Scope));
>> -
>> - if (MDNode *IA = Loc.getInlinedAt(Ctx))
>> - processLocation(DILocation(IA));
>> - }
>> -
>> - if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv")) {
>> - for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> - DIGlobalVariable DIG(cast<MDNode>(NMD->getOperand(i)));
>> - if (addGlobalVariable(DIG)) {
>> - if (DIG.getVersion() <= LLVMDebugVersion10)
>> - addCompileUnit(DIG.getCompileUnit());
>> - processType(DIG.getType());
>> + DIArray GVs = CU.getGlobalVariables();
>> + for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
>> + DIGlobalVariable DIG(GVs.getElement(i));
>> + if (addGlobalVariable(DIG))
>> + processType(DIG.getType());
>> }
>> + DIArray SPs = CU.getSubprograms();
>> + for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
>> + processSubprogram(DISubprogram(SPs.getElement(i)));
>> + DIArray EnumTypes = CU.getEnumTypes();
>> + for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
>> + processType(DIType(EnumTypes.getElement(i)));
>> + DIArray RetainedTypes = CU.getRetainedTypes();
>> + for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
>> + processType(DIType(RetainedTypes.getElement(i)));
>> + // FIXME: We really shouldn't be bailing out after visiting just one CU
>> + return;
>> }
>> }
>> -
>> - if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
>> - for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
>> - processSubprogram(DISubprogram(NMD->getOperand(i)));
>> }
>>
>> /// processLocation - Process DILocation.
>> @@ -891,8 +889,6 @@ void DebugInfoFinder::processLocation(DI
>> void DebugInfoFinder::processType(DIType DT) {
>> if (!addType(DT))
>> return;
>> - if (DT.getVersion() <= LLVMDebugVersion10)
>> - addCompileUnit(DT.getCompileUnit());
>> if (DT.isCompositeType()) {
>> DICompositeType DCT(DT);
>> processType(DCT.getTypeDerivedFrom());
>> @@ -927,8 +923,6 @@ void DebugInfoFinder::processLexicalBloc
>> void DebugInfoFinder::processSubprogram(DISubprogram SP) {
>> if (!addSubprogram(SP))
>> return;
>> - if (SP.getVersion() <= LLVMDebugVersion10)
>> - addCompileUnit(SP.getCompileUnit());
>> processType(SP.getType());
>> }
>>
>> @@ -943,8 +937,6 @@ void DebugInfoFinder::processDeclare(con
>>
>> if (!NodesSeen.insert(DV))
>> return;
>> - if (DIVariable(N).getVersion() <= LLVMDebugVersion10)
>> - addCompileUnit(DIVariable(N).getCompileUnit());
>> processType(DIVariable(N).getType());
>> }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> -David
>
>
More information about the llvm-commits
mailing list