<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hey Nick,<div><br></div><div>This is great stuff. Thanks for doing this.</div><div><br></div><div>I'm seeing a few test failures in the GCC test suite (<a href="https://llvm.org/svn/llvm-project/clang-tests/trunk/gcc-4_2-testsuite">https://llvm.org/svn/llvm-project/clang-tests/trunk/gcc-4_2-testsuite</a>), though. It's fairly likely that they're just tests that need to be updated. Can you have a look?</div><div><br></div><div>gcc.apple/block-debug-1.c scan-assembler __block_descriptor.*DW_AT_name<br>gcc.apple/block-debug-1.c scan-assembler __block_literal_generic.*DW_AT_name<br>gcc.apple/block-debug-2.c scan-assembler __block_descriptor.*DW_AT_name<br>gcc.apple/block-debug-2.c scan-assembler __block_literal_generic.*DW_AT_name<br>gcc.dg/debug/dwarf2/var1.c scan-assembler xyzzy[^\\n\\r]+DW_AT_name</div><div><br></div><div>-Jim</div><div><br><div><div>On Oct 26, 2011, at 11:44 PM, Nick Lewycky wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Author: nicholas<br>Date: Thu Oct 27 01:44:11 2011<br>New Revision: 143097<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=143097&view=rev">http://llvm.org/viewvc/llvm-project?rev=143097&view=rev</a><br>Log:<br>Teach our Dwarf emission to use the string pool.<br><br>Added:<br> llvm/trunk/test/DebugInfo/stringpool.ll<br>Modified:<br> llvm/trunk/include/llvm/CodeGen/AsmPrinter.h<br> llvm/trunk/include/llvm/MC/MCAsmInfo.h<br> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br> llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp<br> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h<br> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br> llvm/trunk/lib/MC/MCAsmInfo.cpp<br> llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp<br> llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll<br> llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll<br> llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll<br><br>Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)<br>+++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Thu Oct 27 01:44:11 2011<br>@@ -194,6 +194,11 @@<br><br> bool needsSEHMoves();<br><br>+ /// needsRelocationsForDwarfStringPool - Specifies whether the object format<br>+ /// expects to use relocations to refer to debug entries. Alternatively we<br>+ /// emit section offsets in bytes from the start of the string pool.<br>+ bool needsRelocationsForDwarfStringPool() const;<br>+<br> /// EmitConstantPool - Print to the current output stream assembly<br> /// representations of the constants in the constant pool MCP. This is<br> /// used to print out constants which have been "spilled to memory" by<br><br>Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)<br>+++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Thu Oct 27 01:44:11 2011<br>@@ -330,6 +330,10 @@<br> /// use EmitLabelOffsetDifference.<br> bool DwarfUsesLabelOffsetForRanges;<br><br>+ /// DwarfUsesRelocationsForStringPool - True if this Dwarf output must use<br>+ /// relocations to refer to entries in the string pool.<br>+ bool DwarfUsesRelocationsForStringPool;<br>+<br> /// DwarfRegNumForCFI - True if dwarf register numbers are printed<br> /// instead of symbolic register names in .cfi_* directives.<br> bool DwarfRegNumForCFI; // Defaults to false;<br>@@ -566,6 +570,9 @@<br> bool doesDwarfUsesLabelOffsetForRanges() const {<br> return DwarfUsesLabelOffsetForRanges;<br> }<br>+ bool doesDwarfUseRelocationsForStringPool() const {<br>+ return DwarfUsesRelocationsForStringPool;<br>+ }<br> bool useDwarfRegNumForCFI() const {<br> return DwarfRegNumForCFI;<br> }<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Thu Oct 27 01:44:11 2011<br>@@ -613,6 +613,10 @@<br> MF->getFunction()->needsUnwindTableEntry();<br> }<br><br>+bool AsmPrinter::needsRelocationsForDwarfStringPool() const {<br>+ return MAI->doesDwarfUseRelocationsForStringPool();<br>+}<br>+<br> void AsmPrinter::emitPrologLabel(const MachineInstr &MI) {<br> MCSymbol *Label = MI.getOperand(0).getMCSymbol();<br><br>@@ -2092,4 +2096,3 @@<br> report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));<br> return 0;<br> }<br>-<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Thu Oct 27 01:44:11 2011<br>@@ -267,6 +267,7 @@<br> ///<br> unsigned DIELabel::SizeOf(AsmPrinter *AP, unsigned Form) const {<br> if (Form == dwarf::DW_FORM_data4) return 4;<br>+ if (Form == dwarf::DW_FORM_strp) return 4;<br> return AP->getTargetData().getPointerSize();<br> }<br><br>@@ -290,6 +291,7 @@<br> ///<br> unsigned DIEDelta::SizeOf(AsmPrinter *AP, unsigned Form) const {<br> if (Form == dwarf::DW_FORM_data4) return 4;<br>+ if (Form == dwarf::DW_FORM_strp) return 4;<br> return AP->getTargetData().getPointerSize();<br> }<br><br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Oct 27 01:44:11 2011<br>@@ -69,10 +69,21 @@<br><br> /// addString - Add a string attribute data and value. DIEString only<br> /// keeps string reference.<br>-void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,<br>- StringRef String) {<br>- DIEValue *Value = new (DIEValueAllocator) DIEString(String);<br>- Die->addValue(Attribute, Form, Value);<br>+void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {<br>+ if (String.size() > 3) {<br>+ MCSymbol *Symb = DD->getStringPoolEntry(String);<br>+ DIEValue *Value;<br>+ if (Asm->needsRelocationsForDwarfStringPool())<br>+ Value = new (DIEValueAllocator) DIELabel(Symb);<br>+ else {<br>+ MCSymbol *StringPool = DD->getStringPool();<br>+ Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);<br>+ }<br>+ Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);<br>+ } else {<br>+ DIEValue *Value = new (DIEValueAllocator) DIEString(String);<br>+ Die->addValue(Attribute, dwarf::DW_FORM_string, Value);<br>+ }<br> }<br><br> /// addLabel - Add a Dwarf label attribute data and value.<br>@@ -479,7 +490,7 @@<br><br> /// addConstantFPValue - Add constant value entry in variable DIE.<br> bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {<br>- assert(MO.isFPImm() && "Invalid machine operand!");<br>+ assert (MO.isFPImm() && "Invalid machine operand!");<br> DIEBlock *Block = new (DIEValueAllocator) DIEBlock();<br> APFloat FPImm = MO.getFPImm()->getValueAPF();<br><br>@@ -660,7 +671,7 @@<br> StringRef Name = BTy.getName();<br> // Add name if not anonymous or intermediate type.<br> if (!Name.empty())<br>- addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+ addString(&Buffer, dwarf::DW_AT_name, Name);<br><br> if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {<br> Buffer.setTag(dwarf::DW_TAG_unspecified_type);<br>@@ -694,7 +705,7 @@<br><br> // Add name if not anonymous or intermediate type.<br> if (!Name.empty())<br>- addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+ addString(&Buffer, dwarf::DW_AT_name, Name);<br><br> // Add size if non-zero (derived types might be zero-sized.)<br> if (Size)<br>@@ -791,8 +802,7 @@<br> else if (Element.isVariable()) {<br> DIVariable DV(Element);<br> ElemDie = new DIE(dwarf::DW_TAG_variable);<br>- addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,<br>- DV.getName());<br>+ addString(ElemDie, dwarf::DW_AT_name, DV.getName());<br> addType(ElemDie, DV.getType());<br> addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);<br> addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);<br>@@ -836,7 +846,7 @@<br><br> // Add name if not anonymous or intermediate type.<br> if (!Name.empty())<br>- addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+ addString(&Buffer, dwarf::DW_AT_name, Name);<br><br> if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type<br> || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)<br>@@ -868,7 +878,7 @@<br><br> ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);<br> addType(ParamDIE, TP.getType());<br>- addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());<br>+ addString(ParamDIE, dwarf::DW_AT_name, TP.getName());<br> return ParamDIE;<br> }<br><br>@@ -883,7 +893,7 @@<br> ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);<br> addType(ParamDIE, TPV.getType());<br> if (!TPV.getName().empty())<br>- addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());<br>+ addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());<br> addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata, <br> TPV.getValue());<br> return ParamDIE;<br>@@ -897,7 +907,7 @@<br> NDie = new DIE(dwarf::DW_TAG_namespace);<br> insertDIE(NS, NDie);<br> if (!NS.getName().empty())<br>- addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());<br>+ addString(NDie, dwarf::DW_AT_name, NS.getName());<br> addSourceLine(NDie, NS);<br> addToContextOwner(NDie, NS.getContext());<br> return NDie;<br>@@ -932,7 +942,7 @@<br><br> StringRef LinkageName = SP.getLinkageName();<br> if (!LinkageName.empty())<br>- addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,<br>+ addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,<br> getRealLinkageName(LinkageName));<br><br> // If this DIE is going to refer declaration info using AT_specification<br>@@ -942,7 +952,7 @@<br><br> // Constructors and operators for anonymous aggregates do not have names.<br> if (!SP.getName().empty())<br>- addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());<br>+ addString(SPDie, dwarf::DW_AT_name, SP.getName());<br><br> addSourceLine(SPDie, SP);<br><br>@@ -1048,13 +1058,12 @@<br> insertDIE(N, VariableDIE);<br><br> // Add name.<br>- addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,<br>- GV.getDisplayName());<br>+ addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());<br> StringRef LinkageName = GV.getLinkageName();<br> bool isGlobalVariable = GV.getGlobal() != NULL;<br> if (!LinkageName.empty() && isGlobalVariable)<br> addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,<br>- dwarf::DW_FORM_string, getRealLinkageName(LinkageName));<br>+ getRealLinkageName(LinkageName));<br> // Add type.<br> DIType GTy = GV.getType();<br> addType(VariableDIE, GTy);<br>@@ -1170,7 +1179,7 @@<br> DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {<br> DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);<br> StringRef Name = ETy.getName();<br>- addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+ addString(Enumerator, dwarf::DW_AT_name, Name);<br> int64_t Value = ETy.getEnumValue();<br> addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);<br> return Enumerator;<br>@@ -1207,8 +1216,7 @@<br> addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,<br> dwarf::DW_FORM_ref4, AbsDIE);<br> else {<br>- addString(VariableDie, dwarf::DW_AT_name, <br>- dwarf::DW_FORM_string, Name);<br>+ addString(VariableDie, dwarf::DW_AT_name, Name);<br> addSourceLine(VariableDie, DV->getVariable());<br> addType(VariableDie, DV->getType());<br> }<br>@@ -1303,7 +1311,7 @@<br> DIE *MemberDie = new DIE(DT.getTag());<br> StringRef Name = DT.getName();<br> if (!Name.empty())<br>- addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+ addString(MemberDie, dwarf::DW_AT_name, Name);<br><br> addType(MemberDie, DT.getTypeDerivedFrom());<br><br>@@ -1377,16 +1385,13 @@<br> // Objective-C properties.<br> StringRef PropertyName = DT.getObjCPropertyName();<br> if (!PropertyName.empty()) {<br>- addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,<br>- PropertyName);<br>+ addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);<br> StringRef GetterName = DT.getObjCPropertyGetterName();<br> if (!GetterName.empty())<br>- addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,<br>- dwarf::DW_FORM_string, GetterName);<br>+ addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);<br> StringRef SetterName = DT.getObjCPropertySetterName();<br> if (!SetterName.empty())<br>- addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,<br>- dwarf::DW_FORM_string, SetterName);<br>+ addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);<br> unsigned PropertyAttributes = 0;<br> if (DT.isReadOnlyObjCProperty())<br> PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Thu Oct 27 01:44:11 2011<br>@@ -150,8 +150,7 @@<br><br> /// addString - Add a string attribute data and value.<br> ///<br>- void addString(DIE *Die, unsigned Attribute, unsigned Form,<br>- const StringRef Str);<br>+ void addString(DIE *Die, unsigned Attribute, const StringRef Str);<br><br> /// addLabel - Add a Dwarf label attribute data and value.<br> ///<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Oct 27 01:44:11 2011<br>@@ -136,6 +136,10 @@<br> DwarfDebug::~DwarfDebug() {<br> }<br><br>+MCSymbol *DwarfDebug::getStringPool() {<br>+ return Asm->GetTempSymbol("section_str");<br>+}<br>+<br> MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {<br> std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];<br> if (Entry.first) return Entry.first;<br>@@ -467,11 +471,10 @@<br><br> DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);<br> CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);<br>- NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,<br>- DIUnit.getProducer());<br>+ NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());<br> NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,<br> DIUnit.getLanguage());<br>- NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);<br>+ NewCU->addString(Die, dwarf::DW_AT_name, FN);<br> // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This<br> // simplifies debug range entries.<br> NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);<br>@@ -484,14 +487,13 @@<br> NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);<br><br> if (!Dir.empty())<br>- NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);<br>+ NewCU->addString(Die, dwarf::DW_AT_comp_dir, Dir);<br> if (DIUnit.isOptimized())<br> NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);<br><br> StringRef Flags = DIUnit.getFlags();<br> if (!Flags.empty())<br>- NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, <br>- Flags);<br>+ NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);<br><br> if (unsigned RVer = DIUnit.getRunTimeVersion())<br> NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,<br>@@ -1796,6 +1798,7 @@<br><br> // Emit the string itself.<br> Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);<br>+ Asm->OutStreamer.EmitZeros(1, 0);<br> }<br> }<br><br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Thu Oct 27 01:44:11 2011<br>@@ -216,8 +216,6 @@<br> StringMap<std::pair<MCSymbol*, unsigned> > StringPool;<br> unsigned NextStringPoolNumber;<br><br>- MCSymbol *getStringPoolEntry(StringRef Str);<br>-<br> /// SectionMap - Provides a unique id per text section.<br> ///<br> UniqueVector<const MCSection*> SectionMap;<br>@@ -504,6 +502,13 @@<br><br> /// createSubprogramDIE - Create new DIE using SP.<br> DIE *createSubprogramDIE(DISubprogram SP);<br>+<br>+ /// getStringPool - returns the entry into the start of the pool.<br>+ MCSymbol *getStringPool();<br>+<br>+ /// getStringPoolEntry - returns an entry into the string pool with the given<br>+ /// string text.<br>+ MCSymbol *getStringPoolEntry(StringRef Str);<br> };<br> } // End of namespace llvm<br><br><br>Modified: llvm/trunk/lib/MC/MCAsmInfo.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/MC/MCAsmInfo.cpp (original)<br>+++ llvm/trunk/lib/MC/MCAsmInfo.cpp Thu Oct 27 01:44:11 2011<br>@@ -91,6 +91,7 @@<br> DwarfRequiresRelocationForSectionOffset = true;<br> DwarfSectionOffsetDirective = 0;<br> DwarfUsesLabelOffsetForRanges = true;<br>+ DwarfUsesRelocationsForStringPool = true;<br> DwarfRegNumForCFI = false;<br> HasMicrosoftFastStdCallMangling = false;<br><br><br>Modified: llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp (original)<br>+++ llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp Thu Oct 27 01:44:11 2011<br>@@ -66,4 +66,5 @@<br><br> DwarfRequiresRelocationForSectionOffset = false;<br> DwarfUsesLabelOffsetForRanges = false;<br>+ DwarfUsesRelocationsForStringPool = false;<br> }<br><br>Modified: llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll (original)<br>+++ llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll Thu Oct 27 01:44:11 2011<br>@@ -6,8 +6,8 @@<br> ;CHECK: Ldebug_loc0:<br> ;CHECK-NEXT: .long Ltmp1<br> ;CHECK-NEXT: .long Ltmp2<br>-;CHECK-NEXT: Lset8 = Ltmp10-Ltmp9 @ Loc expr size<br>-;CHECK-NEXT: .short Lset8<br>+;CHECK-NEXT: Lset[[N:[0-9]+]] = Ltmp10-Ltmp9 @ Loc expr size<br>+;CHECK-NEXT: .short Lset[[N]]<br> ;CHECK-NEXT: Ltmp9:<br> ;CHECK-NEXT: .byte 144 @ DW_OP_regx for S register<br><br><br>Modified: llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll (original)<br>+++ llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll Thu Oct 27 01:44:11 2011<br>@@ -5,17 +5,17 @@<br> ; CHECK:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>17 ## DW_TAG_compile_unit<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>1 ## DW_CHILDREN_yes<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>37 ## DW_AT_producer<br>-; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>8 ## DW_FORM_string<br>+; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>14 ## DW_FORM_strp<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>19 ## DW_AT_language<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>5 ## DW_FORM_data2<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>3 ## DW_AT_name<br>-; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>8 ## DW_FORM_string<br>+; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>14 ## DW_FORM_strp<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>82 ## DW_AT_entry_pc<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>1 ## DW_FORM_addr<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>16 ## DW_AT_stmt_list<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>6 ## DW_FORM_data4<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>27 ## DW_AT_comp_dir<br>-; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>8 ## DW_FORM_string<br>+; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>14 ## DW_FORM_strp<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre"> </span>225 ## DW_AT_APPLE_optimized<br><br> %struct.a = type { i32, %struct.a* }<br><br>Modified: llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll (original)<br>+++ llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll Thu Oct 27 01:44:11 2011<br>@@ -2,14 +2,14 @@<br><br> ; ModuleID = 'test.c'<br><br>-@GLOBAL = common global i32 0, align 4<br>+@GLB = common global i32 0, align 4<br><br> define i32 @f() nounwind {<br>- %LOCAL = alloca i32, align 4<br>- call void @llvm.dbg.declare(metadata !{i32* %LOCAL}, metadata !15), !dbg !17<br>- %1 = load i32* @GLOBAL, align 4, !dbg !18<br>- store i32 %1, i32* %LOCAL, align 4, !dbg !18<br>- %2 = load i32* @GLOBAL, align 4, !dbg !19<br>+ %LOC = alloca i32, align 4<br>+ call void @llvm.dbg.declare(metadata !{i32* %LOC}, metadata !15), !dbg !17<br>+ %1 = load i32* @GLB, align 4, !dbg !18<br>+ store i32 %1, i32* %LOC, align 4, !dbg !18<br>+ %2 = load i32* @GLB, align 4, !dbg !19<br> ret i32 %2, !dbg !19<br> }<br><br>@@ -31,17 +31,17 @@<br> !11 = metadata !{i32 720932} ; [ DW_TAG_base_type ]<br> !12 = metadata !{metadata !13}<br> !13 = metadata !{metadata !14}<br>-!14 = metadata !{i32 720948, i32 0, null, metadata !"GLOBAL", metadata !"GLOBAL", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLOBAL} ; [ DW_TAG_variable ]<br>-!15 = metadata !{i32 721152, metadata !16, metadata !"LOCAL", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ]<br>+!14 = metadata !{i32 720948, i32 0, null, metadata !"GLB", metadata !"GLB", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLB} ; [ DW_TAG_variable ]<br>+!15 = metadata !{i32 721152, metadata !16, metadata !"LOC", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ]<br> !16 = metadata !{i32 720907, metadata !5, i32 3, i32 9, metadata !6, i32 0} ; [ DW_TAG_lexical_block ]<br> !17 = metadata !{i32 4, i32 9, metadata !16, null}<br> !18 = metadata !{i32 4, i32 23, metadata !16, null}<br> !19 = metadata !{i32 5, i32 5, metadata !16, null}<br><br>-; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre"> </span> "GLOBAL"<br>+; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre"> </span> "GLB"<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre"> </span>1<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre"> </span>1<br><br>-; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre"> </span> "LOCAL"<br>+; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre"> </span> "LOC"<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre"> </span>1<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre"> </span>4<br><br>Added: llvm/trunk/test/DebugInfo/stringpool.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/stringpool.ll?rev=143097&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/stringpool.ll?rev=143097&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/DebugInfo/stringpool.ll (added)<br>+++ llvm/trunk/test/DebugInfo/stringpool.ll Thu Oct 27 01:44:11 2011<br>@@ -0,0 +1,54 @@<br>+; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=LINUX<br>+; RUN: llc -O0 -mtriple=x86_64-darwin < %s | FileCheck %s --check-prefix=DARWIN<br>+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"<br>+target triple = "x86_64-unknown-linux-gnu"<br>+<br>+@x = common global i32 0, align 4<br>+@yyyyyyyy = common global i32 0, align 4<br>+<br>+!llvm.dbg.cu = !{!0}<br>+<br>+!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"hello.c", metadata !"/home/nlewycky", metadata !"clang version 3.1 (trunk 143048)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ]<br>+!1 = metadata !{metadata !2}<br>+!2 = metadata !{i32 0}<br>+!3 = metadata !{metadata !4}<br>+!4 = metadata !{metadata !5, metadata !8}<br>+!5 = metadata !{i32 720948, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @x} ; [ DW_TAG_variable ]<br>+!6 = metadata !{i32 720937, metadata !"hello.c", metadata !"/home/nlewycky", null} ; [ DW_TAG_file_type ]<br>+!7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]<br>+!8 = metadata !{i32 720948, i32 0, null, metadata !"yyyyyyyy", metadata !"yyyyyyyy", metadata !"", metadata !6, i32 2, metadata !7, i32 0, i32 1, i32* @yyyyyyyy} ; [ DW_TAG_variable ]<br>+<br>+; 120 is ASCII 'x'. Verify that we use it directly as its name and don't emit<br>+; a reference to the string pool.<br>+; LINUX: .byte 120 # DW_AT_name<br>+; DARWIN: .byte 120 ## DW_AT_name<br>+<br>+; Verify that we refer to 'yyyyyyyy' with a relocation.<br>+; LINUX: .long .Lstring{{[0-9]+}} # DW_AT_name<br>+; LINUX-NEXT: .long 39 # DW_AT_type<br>+; LINUX-NEXT: .byte 1 # DW_AT_external<br>+; LINUX-NEXT: .byte 1 # DW_AT_decl_file<br>+; LINUX-NEXT: .byte 2 # DW_AT_decl_line<br>+; LINUX-NEXT: .byte 9 # DW_AT_location<br>+; LINUX-NEXT: .byte 3<br>+; LINUX-NEXT: .quad yyyyyyyy<br>+<br>+; Verify that we refer to 'yyyyyyyy' without a relocation.<br>+; DARWIN: Lset[[N:[0-9]+]] = Lstring{{[0-9]+}}-Lsection_str ## DW_AT_name<br>+; DARWIN-NEXT: .long Lset[[N]]<br>+; DARWIN-NEXT: .long 39 ## DW_AT_type<br>+; DARWIN-NEXT: .byte 1 ## DW_AT_external<br>+; DARWIN-NEXT: .byte 1 ## DW_AT_decl_file<br>+; DARWIN-NEXT: .byte 2 ## DW_AT_decl_line<br>+; DARWIN-NEXT: .byte 9 ## DW_AT_location<br>+; DARWIN-NEXT: .byte 3<br>+; DARWIN-NEXT: .quad _yyyyyyyy<br>+<br>+<br>+; Verify that "yyyyyyyy" ended up in the stringpool.<br>+; LINUX: .section .debug_str,"MS",@progbits,1<br>+; LINUX-NOT: .section<br>+; LINUX: yyyyyyyy<br>+; DARWIN: .section __DWARF,__debug_str,regular,debug<br>+; DARWIN-NOT: .section<br>+; DARWIN: yyyyyyyy<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br></div></blockquote></div><br></div></body></html>