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 @@ -267,7 +267,7 @@ bool parseStatement(ParseStatementInfo &Info, MCAsmParserSemaCallback *SI); bool parseCurlyBlockScope(SmallVectorImpl& AsmStrRewrites); - bool parseCppHashLineFilenameComment(SMLoc L); + bool parseCppHashLineFilenameComment(SMLoc L, bool SaveLocInfo = true); void checkForBadMacro(SMLoc DirectiveLoc, StringRef Name, StringRef Body, ArrayRef Parameters); @@ -1699,7 +1699,9 @@ StringRef IDVal; int64_t LocalLabelVal = -1; if (Lexer.is(AsmToken::HashDirective)) - return parseCppHashLineFilenameComment(IDLoc); + return parseCppHashLineFilenameComment(IDLoc, + !isInsideMacroInstantiation()); + // Allow an integer followed by a ':' as a directional local label. if (Lexer.is(AsmToken::Integer)) { LocalLabelVal = getTok().getIntVal(); @@ -2294,7 +2296,7 @@ /// parseCppHashLineFilenameComment as this: /// ::= # number "filename" -bool AsmParser::parseCppHashLineFilenameComment(SMLoc L) { +bool AsmParser::parseCppHashLineFilenameComment(SMLoc L, bool SaveLocInfo) { Lex(); // Eat the hash token. // Lexer only ever emits HashDirective if it fully formed if it's // done the checking already so this is an internal error. @@ -2307,6 +2309,9 @@ StringRef Filename = getTok().getString(); Lex(); + if (!SaveLocInfo) + return false; + // Get rid of the enclosing quotes. Filename = Filename.substr(1, Filename.size() - 2); @@ -4454,7 +4459,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 +4480,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