[llvm] r220544 - Fix PR21189 -- Emit symbol subsection required to debug LLVM-built binaries with VS2012+
Timur Iskhodzhanov
timurrrr at google.com
Thu Oct 23 23:09:39 PDT 2014
Looks like this has broken MC/ARM/coff-debugging-secrel.ll on a bunch
of archs – looking...
2014-10-23 18:27 GMT-07:00 Timur Iskhodzhanov <timurrrr at google.com>:
> Author: timurrrr
> Date: Thu Oct 23 20:27:45 2014
> New Revision: 220544
>
> URL: http://llvm.org/viewvc/llvm-project?rev=220544&view=rev
> Log:
> Fix PR21189 -- Emit symbol subsection required to debug LLVM-built binaries with VS2012+
>
> Reviewed at http://reviews.llvm.org/D5772
>
> Modified:
> llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp
> llvm/trunk/test/DebugInfo/COFF/asm.ll
> llvm/trunk/test/DebugInfo/COFF/multifile.ll
> llvm/trunk/test/DebugInfo/COFF/multifunction.ll
> llvm/trunk/test/DebugInfo/COFF/simple.ll
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp?rev=220544&r1=220543&r2=220544&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp Thu Oct 23 20:27:45 2014
> @@ -168,14 +168,15 @@ void WinCodeViewLineTables::endModule()
> }
>
> static void EmitLabelDiff(MCStreamer &Streamer,
> - const MCSymbol *From, const MCSymbol *To) {
> + const MCSymbol *From, const MCSymbol *To,
> + unsigned int Size = 4) {
> MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
> MCContext &Context = Streamer.getContext();
> const MCExpr *FromRef = MCSymbolRefExpr::Create(From, Variant, Context),
> *ToRef = MCSymbolRefExpr::Create(To, Variant, Context);
> const MCExpr *AddrDelta =
> MCBinaryExpr::Create(MCBinaryExpr::Sub, ToRef, FromRef, Context);
> - Streamer.EmitValue(AddrDelta, 4);
> + Streamer.EmitValue(AddrDelta, Size);
> }
>
> void WinCodeViewLineTables::emitDebugInfoForFunction(const Function *GV) {
> @@ -189,6 +190,44 @@ void WinCodeViewLineTables::emitDebugInf
> return;
> assert(FI.End && "Don't know where the function ends?");
>
> + const StringRef FuncName = getDISubprogram(GV).getDisplayName();
> + // Emit a symbol subsection, required by VS2012+ to find function boundaries.
> + MCSymbol *SymbolsBegin = Asm->MMI->getContext().CreateTempSymbol(),
> + *SymbolsEnd = Asm->MMI->getContext().CreateTempSymbol();
> + Asm->OutStreamer.AddComment("Symbol subsection for " + Twine(FuncName));
> + Asm->EmitInt32(COFF::DEBUG_SYMBOL_SUBSECTION);
> + EmitLabelDiff(Asm->OutStreamer, SymbolsBegin, SymbolsEnd);
> + Asm->OutStreamer.EmitLabel(SymbolsBegin);
> + {
> + MCSymbol *ProcSegmentBegin = Asm->MMI->getContext().CreateTempSymbol(),
> + *ProcSegmentEnd = Asm->MMI->getContext().CreateTempSymbol();
> + EmitLabelDiff(Asm->OutStreamer, ProcSegmentBegin, ProcSegmentEnd, 2);
> + Asm->OutStreamer.EmitLabel(ProcSegmentBegin);
> +
> + Asm->EmitInt16(COFF::DEBUG_SYMBOL_TYPE_PROC_START);
> + // Some bytes of this segment don't seem to be required for basic debugging,
> + // so just fill them with zeroes.
> + Asm->OutStreamer.EmitFill(12, 0);
> + // This is the important bit that tells the debugger where the function
> + // code is located and what's its size:
> + EmitLabelDiff(Asm->OutStreamer, Fn, FI.End);
> + Asm->OutStreamer.EmitFill(12, 0);
> + Asm->OutStreamer.EmitCOFFSecRel32(Fn);
> + Asm->OutStreamer.EmitCOFFSectionIndex(Fn);
> + Asm->EmitInt8(0);
> + // Emit the function name as a null-terminated string.
> + Asm->OutStreamer.EmitBytes(FuncName);
> + Asm->EmitInt8(0);
> + Asm->OutStreamer.EmitLabel(ProcSegmentEnd);
> +
> + // We're done with this function.
> + Asm->EmitInt16(0x0002);
> + Asm->EmitInt16(COFF::DEBUG_SYMBOL_TYPE_PROC_END);
> + }
> + Asm->OutStreamer.EmitLabel(SymbolsEnd);
> + // Every subsection must be aligned to a 4-byte boundary.
> + Asm->OutStreamer.EmitFill((-FuncName.size()) % 4, 0);
> +
> // PCs/Instructions are grouped into segments sharing the same filename.
> // Pre-calculate the lengths (in instructions) of these segments and store
> // them in a map for convenience. Each index in the map is the sequential
> @@ -206,13 +245,12 @@ void WinCodeViewLineTables::emitDebugInf
> FilenameSegmentLengths[LastSegmentEnd] = FI.Instrs.size() - LastSegmentEnd;
>
> // Emit a line table subsection, requred to do PC-to-file:line lookup.
> - Asm->OutStreamer.AddComment(
> - "Line table subsection for " + Twine(Fn->getName()));
> + Asm->OutStreamer.AddComment("Line table subsection for " + Twine(FuncName));
> Asm->EmitInt32(COFF::DEBUG_LINE_TABLE_SUBSECTION);
> - MCSymbol *SubsectionBegin = Asm->MMI->getContext().CreateTempSymbol(),
> - *SubsectionEnd = Asm->MMI->getContext().CreateTempSymbol();
> - EmitLabelDiff(Asm->OutStreamer, SubsectionBegin, SubsectionEnd);
> - Asm->OutStreamer.EmitLabel(SubsectionBegin);
> + MCSymbol *LineTableBegin = Asm->MMI->getContext().CreateTempSymbol(),
> + *LineTableEnd = Asm->MMI->getContext().CreateTempSymbol();
> + EmitLabelDiff(Asm->OutStreamer, LineTableBegin, LineTableEnd);
> + Asm->OutStreamer.EmitLabel(LineTableBegin);
>
> // Identify the function this subsection is for.
> Asm->OutStreamer.EmitCOFFSecRel32(Fn);
> @@ -262,7 +300,7 @@ void WinCodeViewLineTables::emitDebugInf
>
> if (FileSegmentEnd)
> Asm->OutStreamer.EmitLabel(FileSegmentEnd);
> - Asm->OutStreamer.EmitLabel(SubsectionEnd);
> + Asm->OutStreamer.EmitLabel(LineTableEnd);
> }
>
> void WinCodeViewLineTables::beginFunction(const MachineFunction *MF) {
>
> Modified: llvm/trunk/test/DebugInfo/COFF/asm.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/asm.ll?rev=220544&r1=220543&r2=220544&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/asm.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/asm.ll Thu Oct 23 20:27:45 2014
> @@ -23,6 +23,28 @@
> ;
> ; X86-LABEL: .section .debug$S,"rd"
> ; X86-NEXT: .long 4
> +; Symbol subsection
> +; X86-NEXT: .long 241
> +; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X86-NEXT: [[F1_START]]:
> +; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X86-NEXT: [[PROC_SEGMENT_START]]:
> +; X86-NEXT: .short 4423
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .long [[END_OF_F]]-_f
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .secrel32 _f
> +; X86-NEXT: .secidx _f
> +; X86-NEXT: .byte 0
> +; X86-NEXT: .byte 102
> +; X86-NEXT: .byte 0
> +; X86-NEXT: [[PROC_SEGMENT_END]]:
> +; X86-NEXT: .short 2
> +; X86-NEXT: .short 4431
> +; X86-NEXT: [[F1_END]]:
> +; Padding
> +; X86-NEXT: .zero 3
> +; Line table
> ; X86-NEXT: .long 242
> ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> ; X86-NEXT: [[F2_START]]:
> @@ -61,8 +83,20 @@
> ; OBJ32: Characteristics [ (0x42100040)
> ; OBJ32: ]
> ; OBJ32: Relocations [
> -; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _f
> -; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x2C IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x30 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x44 IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x48 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF1
> +; OBJ32-NOT: ]
> +; OBJ32: ProcStart {
> +; OBJ32-NEXT: FunctionName: f
> +; OBJ32-NEXT: Section: _f
> +; OBJ32-NEXT: CodeSize: 0x6
> +; OBJ32-NEXT: }
> +; OBJ32-NEXT: ProcEnd
> ; OBJ32-NEXT: ]
> ; OBJ32: FunctionLineTable [
> ; OBJ32-NEXT: Name: _f
> @@ -93,6 +127,28 @@
> ;
> ; X64-LABEL: .section .debug$S,"rd"
> ; X64-NEXT: .long 4
> +; Symbol subsection
> +; X64-NEXT: .long 241
> +; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X64-NEXT: [[F1_START]]:
> +; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X64-NEXT: [[PROC_SEGMENT_START]]:
> +; X64-NEXT: .short 4423
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .long [[END_OF_F]]-f
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .secrel32 f
> +; X64-NEXT: .secidx f
> +; X64-NEXT: .byte 0
> +; X64-NEXT: .byte 102
> +; X64-NEXT: .byte 0
> +; X64-NEXT: [[PROC_SEGMENT_END]]:
> +; X64-NEXT: .short 2
> +; X64-NEXT: .short 4431
> +; X64-NEXT: [[F1_END]]:
> +; Padding
> +; X64-NEXT: .zero 3
> +; Line table
> ; X64-NEXT: .long 242
> ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> ; X64-NEXT: [[F2_START]]:
> @@ -133,8 +189,20 @@
> ; OBJ64: Characteristics [ (0x42100040)
> ; OBJ64: ]
> ; OBJ64: Relocations [
> -; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL f
> -; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x2C IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x30 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x44 IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF1
> +; OBJ64-NOT: ]
> +; OBJ64: ProcStart {
> +; OBJ64-NEXT: FunctionName: f
> +; OBJ64-NEXT: Section: f
> +; OBJ64-NEXT: CodeSize: 0xE
> +; OBJ64-NEXT: }
> +; OBJ64-NEXT: ProcEnd
> ; OBJ64-NEXT: ]
> ; OBJ64: FunctionLineTable [
> ; OBJ64-NEXT: Name: f
>
> Modified: llvm/trunk/test/DebugInfo/COFF/multifile.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/multifile.ll?rev=220544&r1=220543&r2=220544&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/multifile.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/multifile.ll Thu Oct 23 20:27:45 2014
> @@ -30,6 +30,28 @@
> ;
> ; X86-LABEL: .section .debug$S,"rd"
> ; X86-NEXT: .long 4
> +; Symbol subsection
> +; X86-NEXT: .long 241
> +; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X86-NEXT: [[F1_START]]:
> +; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X86-NEXT: [[PROC_SEGMENT_START]]:
> +; X86-NEXT: .short 4423
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .long [[END_OF_F]]-_f
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .secrel32 _f
> +; X86-NEXT: .secidx _f
> +; X86-NEXT: .byte 0
> +; X86-NEXT: .byte 102
> +; X86-NEXT: .byte 0
> +; X86-NEXT: [[PROC_SEGMENT_END]]:
> +; X86-NEXT: .short 2
> +; X86-NEXT: .short 4431
> +; X86-NEXT: [[F1_END]]:
> +; Padding
> +; X86-NEXT: .zero 3
> +; Line table
> ; X86-NEXT: .long 242
> ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> ; X86-NEXT: [[F2_START]]:
> @@ -86,8 +108,20 @@
> ; OBJ32: Characteristics [ (0x42100040)
> ; OBJ32: ]
> ; OBJ32: Relocations [
> -; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _f
> -; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x2C IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x30 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x44 IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x48 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF1
> +; OBJ32-NOT: ]
> +; OBJ32: ProcStart {
> +; OBJ32-NEXT: FunctionName: f
> +; OBJ32-NEXT: Section: _f
> +; OBJ32-NEXT: CodeSize: 0x10
> +; OBJ32-NEXT: }
> +; OBJ32-NEXT: ProcEnd
> ; OBJ32-NEXT: ]
> ; OBJ32: FunctionLineTable [
> ; OBJ32-NEXT: Name: _f
> @@ -125,6 +159,28 @@
> ;
> ; X64-LABEL: .section .debug$S,"rd"
> ; X64-NEXT: .long 4
> +; Symbol subsection
> +; X64-NEXT: .long 241
> +; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X64-NEXT: [[F1_START]]:
> +; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X64-NEXT: [[PROC_SEGMENT_START]]:
> +; X64-NEXT: .short 4423
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .long [[END_OF_F]]-f
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .secrel32 f
> +; X64-NEXT: .secidx f
> +; X64-NEXT: .byte 0
> +; X64-NEXT: .byte 102
> +; X64-NEXT: .byte 0
> +; X64-NEXT: [[PROC_SEGMENT_END]]:
> +; X64-NEXT: .short 2
> +; X64-NEXT: .short 4431
> +; X64-NEXT: [[F1_END]]:
> +; Padding
> +; X64-NEXT: .zero 3
> +; Line table
> ; X64-NEXT: .long 242
> ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> ; X64-NEXT: [[F2_START]]:
> @@ -193,8 +249,20 @@
> ; OBJ64: Characteristics [ (0x42100040)
> ; OBJ64: ]
> ; OBJ64: Relocations [
> -; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL f
> -; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x2C IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x30 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x44 IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF1
> +; OBJ64-NOT: ]
> +; OBJ64: ProcStart {
> +; OBJ64-NEXT: FunctionName: f
> +; OBJ64-NEXT: Section: f
> +; OBJ64-NEXT: CodeSize: 0x18
> +; OBJ64-NEXT: }
> +; OBJ64-NEXT: ProcEnd
> ; OBJ64-NEXT: ]
> ; OBJ64: FunctionLineTable [
> ; OBJ64-NEXT: Name: f
>
> Modified: llvm/trunk/test/DebugInfo/COFF/multifunction.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/multifunction.ll?rev=220544&r1=220543&r2=220544&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/multifunction.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/multifunction.ll Thu Oct 23 20:27:45 2014
> @@ -52,6 +52,27 @@
> ;
> ; X86-LABEL: .section .debug$S,"rd"
> ; X86-NEXT: .long 4
> +; Symbol subsection for x
> +; X86-NEXT: .long 241
> +; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X86-NEXT: [[F1_START]]:
> +; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X86-NEXT: [[PROC_SEGMENT_START]]:
> +; X86-NEXT: .short 4423
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .long [[END_OF_X]]-_x
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .secrel32 _x
> +; X86-NEXT: .secidx _x
> +; X86-NEXT: .byte 0
> +; X86-NEXT: .byte 120
> +; X86-NEXT: .byte 0
> +; X86-NEXT: [[PROC_SEGMENT_END]]:
> +; X86-NEXT: .short 2
> +; X86-NEXT: .short 4431
> +; X86-NEXT: [[F1_END]]:
> +; Padding
> +; X86-NEXT: .zero 3
> ; Line table subsection for x
> ; X86-NEXT: .long 242
> ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> @@ -70,6 +91,27 @@
> ; X86-NEXT: .long 5
> ; X86-NEXT: [[FILE_SEGMENT_END]]:
> ; X86-NEXT: [[F2_END]]:
> +; Symbol subsection for y
> +; X86-NEXT: .long 241
> +; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X86-NEXT: [[F1_START]]:
> +; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X86-NEXT: [[PROC_SEGMENT_START]]:
> +; X86-NEXT: .short 4423
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .long [[END_OF_Y]]-_y
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .secrel32 _y
> +; X86-NEXT: .secidx _y
> +; X86-NEXT: .byte 0
> +; X86-NEXT: .byte 121
> +; X86-NEXT: .byte 0
> +; X86-NEXT: [[PROC_SEGMENT_END]]:
> +; X86-NEXT: .short 2
> +; X86-NEXT: .short 4431
> +; X86-NEXT: [[F1_END]]:
> +; Padding
> +; X86-NEXT: .zero 3
> ; Line table subsection for y
> ; X86-NEXT: .long 242
> ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> @@ -88,6 +130,27 @@
> ; X86-NEXT: .long 9
> ; X86-NEXT: [[FILE_SEGMENT_END]]:
> ; X86-NEXT: [[F2_END]]:
> +; Symbol subsection for f
> +; X86-NEXT: .long 241
> +; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X86-NEXT: [[F1_START]]:
> +; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X86-NEXT: [[PROC_SEGMENT_START]]:
> +; X86-NEXT: .short 4423
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .long [[END_OF_F]]-_f
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .secrel32 _f
> +; X86-NEXT: .secidx _f
> +; X86-NEXT: .byte 0
> +; X86-NEXT: .byte 102
> +; X86-NEXT: .byte 0
> +; X86-NEXT: [[PROC_SEGMENT_END]]:
> +; X86-NEXT: .short 2
> +; X86-NEXT: .short 4431
> +; X86-NEXT: [[F1_END]]:
> +; Padding
> +; X86-NEXT: .zero 3
> ; Line table subsection for f
> ; X86-NEXT: .long 242
> ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> @@ -128,13 +191,58 @@
> ; OBJ32: Characteristics [ (0x42100040)
> ; OBJ32: ]
> ; OBJ32: Relocations [
> -; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _x
> -; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _x
> -; OBJ32-NEXT: 0x3C IMAGE_REL_I386_SECREL _y
> -; OBJ32-NEXT: 0x40 IMAGE_REL_I386_SECTION _y
> -; OBJ32-NEXT: 0x6C IMAGE_REL_I386_SECREL _f
> -; OBJ32-NEXT: 0x70 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x2C IMAGE_REL_I386_SECREL _x
> +; OBJ32-NEXT: 0x30 IMAGE_REL_I386_SECTION _x
> +; OBJ32-NEXT: 0x44 IMAGE_REL_I386_SECREL _x
> +; OBJ32-NEXT: 0x48 IMAGE_REL_I386_SECTION _x
> +; OBJ32-NEXT: 0x94 IMAGE_REL_I386_SECREL _y
> +; OBJ32-NEXT: 0x98 IMAGE_REL_I386_SECTION _y
> +; OBJ32-NEXT: 0xAC IMAGE_REL_I386_SECREL _y
> +; OBJ32-NEXT: 0xB0 IMAGE_REL_I386_SECTION _y
> +; OBJ32-NEXT: 0xFC IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x100 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x114 IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x118 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF1
> +; OBJ32-NOT: ]
> +; OBJ32: ProcStart {
> +; OBJ32-NEXT: FunctionName: x
> +; OBJ32-NEXT: Section: _x
> +; OBJ32-NEXT: CodeSize: 0x6
> +; OBJ32-NEXT: }
> +; OBJ32-NEXT: ProcEnd
> ; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF2
> +; OBJ32: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF1
> +; OBJ32-NOT: ]
> +; OBJ32: ProcStart {
> +; OBJ32-NEXT: FunctionName: y
> +; OBJ32-NEXT: Section: _y
> +; OBJ32-NEXT: CodeSize: 0x6
> +; OBJ32-NEXT: }
> +; OBJ32-NEXT: ProcEnd
> +; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF2
> +; OBJ32: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF1
> +; OBJ32-NOT: ]
> +; OBJ32: ProcStart {
> +; OBJ32-NEXT: FunctionName: f
> +; OBJ32-NEXT: Section: _f
> +; OBJ32-NEXT: CodeSize: 0x10
> +; OBJ32-NEXT: }
> +; OBJ32-NEXT: ProcEnd
> +; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF2
> +; OBJ32: ]
> ; OBJ32: FunctionLineTable [
> ; OBJ32-NEXT: Name: _x
> ; OBJ32-NEXT: CodeSize: 0x6
> @@ -205,6 +313,27 @@
> ;
> ; X64-LABEL: .section .debug$S,"rd"
> ; X64-NEXT: .long 4
> +; Symbol subsection for x
> +; X64-NEXT: .long 241
> +; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X64-NEXT: [[F1_START]]:
> +; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X64-NEXT: [[PROC_SEGMENT_START]]:
> +; X64-NEXT: .short 4423
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .long [[END_OF_X]]-x
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .secrel32 x
> +; X64-NEXT: .secidx x
> +; X64-NEXT: .byte 0
> +; X64-NEXT: .byte 120
> +; X64-NEXT: .byte 0
> +; X64-NEXT: [[PROC_SEGMENT_END]]:
> +; X64-NEXT: .short 2
> +; X64-NEXT: .short 4431
> +; X64-NEXT: [[F1_END]]:
> +; Padding
> +; X64-NEXT: .zero 3
> ; Line table subsection for x
> ; X64-NEXT: .long 242
> ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> @@ -225,6 +354,27 @@
> ; X64-NEXT: .long 5
> ; X64-NEXT: [[FILE_SEGMENT_END]]:
> ; X64-NEXT: [[F2_END]]:
> +; Symbol subsection for y
> +; X64-NEXT: .long 241
> +; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X64-NEXT: [[F1_START]]:
> +; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X64-NEXT: [[PROC_SEGMENT_START]]:
> +; X64-NEXT: .short 4423
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .long [[END_OF_Y]]-y
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .secrel32 y
> +; X64-NEXT: .secidx y
> +; X64-NEXT: .byte 0
> +; X64-NEXT: .byte 121
> +; X64-NEXT: .byte 0
> +; X64-NEXT: [[PROC_SEGMENT_END]]:
> +; X64-NEXT: .short 2
> +; X64-NEXT: .short 4431
> +; X64-NEXT: [[F1_END]]:
> +; Padding
> +; X64-NEXT: .zero 3
> ; Line table subsection for y
> ; X64-NEXT: .long 242
> ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> @@ -245,6 +395,27 @@
> ; X64-NEXT: .long 9
> ; X64-NEXT: [[FILE_SEGMENT_END]]:
> ; X64-NEXT: [[F2_END]]:
> +; Symbol subsection for f
> +; X64-NEXT: .long 241
> +; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X64-NEXT: [[F1_START]]:
> +; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X64-NEXT: [[PROC_SEGMENT_START]]:
> +; X64-NEXT: .short 4423
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .long [[END_OF_F]]-f
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .secrel32 f
> +; X64-NEXT: .secidx f
> +; X64-NEXT: .byte 0
> +; X64-NEXT: .byte 102
> +; X64-NEXT: .byte 0
> +; X64-NEXT: [[PROC_SEGMENT_END]]:
> +; X64-NEXT: .short 2
> +; X64-NEXT: .short 4431
> +; X64-NEXT: [[F1_END]]:
> +; Padding
> +; X64-NEXT: .zero 3
> ; Line table subsection for f
> ; X64-NEXT: .long 242
> ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> @@ -287,13 +458,58 @@
> ; OBJ64: Characteristics [ (0x42100040)
> ; OBJ64: ]
> ; OBJ64: Relocations [
> -; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL x
> -; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION x
> -; OBJ64-NEXT: 0x44 IMAGE_REL_AMD64_SECREL y
> -; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION y
> -; OBJ64-NEXT: 0x7C IMAGE_REL_AMD64_SECREL f
> -; OBJ64-NEXT: 0x80 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x2C IMAGE_REL_AMD64_SECREL x
> +; OBJ64-NEXT: 0x30 IMAGE_REL_AMD64_SECTION x
> +; OBJ64-NEXT: 0x44 IMAGE_REL_AMD64_SECREL x
> +; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION x
> +; OBJ64-NEXT: 0x9C IMAGE_REL_AMD64_SECREL y
> +; OBJ64-NEXT: 0xA0 IMAGE_REL_AMD64_SECTION y
> +; OBJ64-NEXT: 0xB4 IMAGE_REL_AMD64_SECREL y
> +; OBJ64-NEXT: 0xB8 IMAGE_REL_AMD64_SECTION y
> +; OBJ64-NEXT: 0x10C IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x110 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x124 IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x128 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF1
> +; OBJ64-NOT: ]
> +; OBJ64: ProcStart {
> +; OBJ64-NEXT: FunctionName: x
> +; OBJ64-NEXT: Section: x
> +; OBJ64-NEXT: CodeSize: 0xE
> +; OBJ64-NEXT: }
> +; OBJ64-NEXT: ProcEnd
> ; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF2
> +; OBJ64: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF1
> +; OBJ64-NOT: ]
> +; OBJ64: ProcStart {
> +; OBJ64-NEXT: FunctionName: y
> +; OBJ64-NEXT: Section: y
> +; OBJ64-NEXT: CodeSize: 0xE
> +; OBJ64-NEXT: }
> +; OBJ64-NEXT: ProcEnd
> +; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF2
> +; OBJ64: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF1
> +; OBJ64-NOT: ]
> +; OBJ64: ProcStart {
> +; OBJ64-NEXT: FunctionName: f
> +; OBJ64-NEXT: Section: f
> +; OBJ64-NEXT: CodeSize: 0x18
> +; OBJ64-NEXT: }
> +; OBJ64-NEXT: ProcEnd
> +; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF2
> +; OBJ64: ]
> ; OBJ64: FunctionLineTable [
> ; OBJ64-NEXT: Name: x
> ; OBJ64-NEXT: CodeSize: 0xE
>
> Modified: llvm/trunk/test/DebugInfo/COFF/simple.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/simple.ll?rev=220544&r1=220543&r2=220544&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/simple.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/simple.ll Thu Oct 23 20:27:45 2014
> @@ -21,12 +21,34 @@
> ;
> ; X86-LABEL: .section .debug$S,"rd"
> ; X86-NEXT: .long 4
> +; Symbol subsection
> +; X86-NEXT: .long 241
> +; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X86-NEXT: [[F1_START]]:
> +; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X86-NEXT: [[PROC_SEGMENT_START]]:
> +; X86-NEXT: .short 4423
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .long [[END_OF_F]]-_f
> +; X86-NEXT: .zero 12
> +; X86-NEXT: .secrel32 _f
> +; X86-NEXT: .secidx _f
> +; X86-NEXT: .byte 0
> +; X86-NEXT: .byte 102
> +; X86-NEXT: .byte 0
> +; X86-NEXT: [[PROC_SEGMENT_END]]:
> +; X86-NEXT: .short 2
> +; X86-NEXT: .short 4431
> +; X86-NEXT: [[F1_END]]:
> +; Padding
> +; X86-NEXT: .zero 3
> +; Line table
> ; X86-NEXT: .long 242
> ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> ; X86-NEXT: [[F2_START]]:
> ; X86-NEXT: .secrel32 _f
> ; X86-NEXT: .secidx _f
> -; X86-NEXT: .short 0
> +; X86-NEXT: .short 0
> ; X86-NEXT: .long [[END_OF_F]]-_f
> ; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> ; X86-NEXT: .long 0
> @@ -57,8 +79,20 @@
> ; OBJ32: Characteristics [ (0x42100040)
> ; OBJ32: ]
> ; OBJ32: Relocations [
> -; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _f
> -; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x2C IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x30 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: 0x44 IMAGE_REL_I386_SECREL _f
> +; OBJ32-NEXT: 0x48 IMAGE_REL_I386_SECTION _f
> +; OBJ32-NEXT: ]
> +; OBJ32: Subsection [
> +; OBJ32-NEXT: Type: 0xF1
> +; OBJ32-NOT: ]
> +; OBJ32: ProcStart {
> +; OBJ32-NEXT: FunctionName: f
> +; OBJ32-NEXT: Section: _f
> +; OBJ32-NEXT: CodeSize: 0x6
> +; OBJ32-NEXT: }
> +; OBJ32-NEXT: ProcEnd
> ; OBJ32-NEXT: ]
> ; OBJ32: FunctionLineTable [
> ; OBJ32-NEXT: Name: _f
> @@ -84,12 +118,34 @@
> ;
> ; X64-LABEL: .section .debug$S,"rd"
> ; X64-NEXT: .long 4
> +; Symbol subsection
> +; X64-NEXT: .long 241
> +; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]]
> +; X64-NEXT: [[F1_START]]:
> +; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]]
> +; X64-NEXT: [[PROC_SEGMENT_START]]:
> +; X64-NEXT: .short 4423
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .long [[END_OF_F]]-f
> +; X64-NEXT: .zero 12
> +; X64-NEXT: .secrel32 f
> +; X64-NEXT: .secidx f
> +; X64-NEXT: .byte 0
> +; X64-NEXT: .byte 102
> +; X64-NEXT: .byte 0
> +; X64-NEXT: [[PROC_SEGMENT_END]]:
> +; X64-NEXT: .short 2
> +; X64-NEXT: .short 4431
> +; X64-NEXT: [[F1_END]]:
> +; Padding
> +; X64-NEXT: .zero 3
> +; Line table
> ; X64-NEXT: .long 242
> ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> ; X64-NEXT: [[F2_START]]:
> ; X64-NEXT: .secrel32 f
> ; X64-NEXT: .secidx f
> -; X64-NEXT: .short 0
> +; X64-NEXT: .short 0
> ; X64-NEXT: .long [[END_OF_F]]-f
> ; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> ; X64-NEXT: .long 0
> @@ -122,8 +178,20 @@
> ; OBJ64: Characteristics [ (0x42100040)
> ; OBJ64: ]
> ; OBJ64: Relocations [
> -; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL f
> -; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x2C IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x30 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: 0x44 IMAGE_REL_AMD64_SECREL f
> +; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION f
> +; OBJ64-NEXT: ]
> +; OBJ64: Subsection [
> +; OBJ64-NEXT: Type: 0xF1
> +; OBJ64-NOT: ]
> +; OBJ64: ProcStart {
> +; OBJ64-NEXT: FunctionName: f
> +; OBJ64-NEXT: Section: f
> +; OBJ64-NEXT: CodeSize: 0xE
> +; OBJ64-NEXT: }
> +; OBJ64-NEXT: ProcEnd
> ; OBJ64-NEXT: ]
> ; OBJ64: FunctionLineTable [
> ; OBJ64-NEXT: Name: f
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list