From 3681929e116d9b753666436109f1faffd89ff279 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Wed, 24 Dec 2014 06:32:43 +0000 Subject: [PATCH] IAS: correct debug line info for asm macros Correct the line information generation for preprocessed assembly. Although we tracked the source information for the macro instantiation, we failed to account for the fact that we were instantiating a macro, which is populated into a new buffer and that the line information would be relative to the definition rather than the actual instantiation location. This could cause the line number associated with the statement to be very high due to wrapping of the difference calculated for the preprocessor line information emitted into the stream. Properly calculate the line for the macro instantiation, referencing the line where the macro is actually used as GCC/gas do. The test case uses x86, though the same problem exists on any other target using the LLVM IAS. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224810 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCParser/AsmParser.cpp | 12 ++++++++---- test/DebugInfo/X86/asm-macro-line-number.s | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 test/DebugInfo/X86/asm-macro-line-number.s diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 68889cb2053..9becb403d57 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -1595,14 +1595,18 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // directive for the instruction. if (!HadError && getContext().getGenDwarfForAssembly() && getContext().getGenDwarfSectionSyms().count( - getStreamer().getCurrentSection().first)) { - - unsigned Line = SrcMgr.FindLineNumber(IDLoc, CurBuffer); + getStreamer().getCurrentSection().first)) { + unsigned Line; + if (ActiveMacros.empty()) + Line = SrcMgr.FindLineNumber(IDLoc, CurBuffer); + else + Line = SrcMgr.FindLineNumber(ActiveMacros.back()->InstantiationLoc, + ActiveMacros.back()->ExitBuffer); // If we previously parsed a cpp hash file line comment then make sure the // current Dwarf File is for the CppHashFilename if not then emit the // Dwarf File table for it and adjust the line number for the .loc. - if (CppHashFilename.size() != 0) { + if (CppHashFilename.size()) { unsigned FileNumber = getStreamer().EmitDwarfFileDirective( 0, StringRef(), CppHashFilename); getContext().setGenDwarfFileNumber(FileNumber); diff --git a/test/DebugInfo/X86/asm-macro-line-number.s b/test/DebugInfo/X86/asm-macro-line-number.s new file mode 100644 index 00000000000..0f51dbb6440 --- /dev/null +++ b/test/DebugInfo/X86/asm-macro-line-number.s @@ -0,0 +1,20 @@ +# RUN: llvm-mc -g -triple i686-linux-gnu -filetype asm -o - %s | FileCheck %s + +# 1 "reduced.S" +# 1 "" 1 +# 1 "reduced.S" 2 + + .macro return arg + movl %eax, \arg + retl + .endm + +function: + return 0 + +# CHECK: .file 2 "reduced.S" +# CHECK: .loc 2 8 0 +# CHECK: movl %eax, 0 +# CHECK: .loc 2 8 0 +# CHECK: retl + -- 2.34.1