diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -1698,8 +1698,20 @@ SMLoc IDLoc = ID.getLoc(); StringRef IDVal; int64_t LocalLabelVal = -1; - if (Lexer.is(AsmToken::HashDirective)) - return parseCppHashLineFilenameComment(IDLoc); + if (Lexer.is(AsmToken::HashDirective)) { + // Do not evaluate line markers during instantiation. + if (!isInsideMacroInstantiation()) + return parseCppHashLineFilenameComment(IDLoc); + // Eat the line marker. + Lex(); + assert(getTok().is(AsmToken::Integer) && + "Lexing Cpp line comment: Expected Integer"); + Lex(); + assert(getTok().is(AsmToken::String) && + "Lexing Cpp line comment: Expected String"); + Lex(); + return false; + } // Allow an integer followed by a ':' as a directional local label. if (Lexer.is(AsmToken::Integer)) { LocalLabelVal = getTok().getIntVal(); @@ -4454,7 +4466,8 @@ if (getLexer().is(AsmToken::Eof)) return Error(DirectiveLoc, "no matching '.endmacro' in definition"); - // Otherwise, check whether we have reach the .endmacro. + // Otherwise, check whether we have reach the .endmacro or the start of a + // preprocessor line marker. if (getLexer().is(AsmToken::Identifier)) { if (getTok().getIdentifier() == ".endm" || getTok().getIdentifier() == ".endmacro") { @@ -4474,6 +4487,8 @@ // macro is expanded so just ignore them for now. ++MacroDepth; } + } else if (Lexer.is(AsmToken::HashDirective)) { + (void)parseCppHashLineFilenameComment(getLexer().getLoc()); } // Otherwise, scan til the end of the statement. diff --git a/llvm/test/MC/AsmParser/line-marker-inside-macro.s b/llvm/test/MC/AsmParser/line-marker-inside-macro.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/AsmParser/line-marker-inside-macro.s @@ -0,0 +1,14 @@ +// RUN: llvm-mc -triple i386-unknown-unknown --filetype=obj -g %s -o %t +// RUN: llvm-dwarfdump -a %t | FileCheck %s + +.macro FOO +# 100 "./line-marker-inside-macro.s" +.endm + + + +FOO + mov %eax, 0 + +// CHECK: 0x0000000000000000 105 0 1 0 0 is_stmt +// CHECK-NEXT: 0x0000000000000005 105 0 1 0 0 is_stmt end_sequence