john.brawn created this revision. john.brawn added reviewers: aaron.ballman, rsmith, jansvoboda11, rjmccall. Herald added a project: All. john.brawn requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
GNU line marker directives are not recognised when preprocessing assembly files, meaning they can't be used in the predefines file meaning macros defined on the command line are reported as being built-in. Change this to permit line markers but only in the predefines file, so we can correctly report command line macros as coming from the command line. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D145397 Files: clang/lib/Frontend/InitPreprocessor.cpp clang/lib/Lex/PPDirectives.cpp clang/test/Preprocessor/directives_asm.S clang/test/Preprocessor/macro_redefined.S
Index: clang/test/Preprocessor/macro_redefined.S =================================================================== --- /dev/null +++ clang/test/Preprocessor/macro_redefined.S @@ -0,0 +1,10 @@ +// RUN: %clang %s -E -DCLI_MACRO=1 2>&1 | FileCheck %s + +#define CLI_MACRO +// CHECK: macro_redefined.S{{.+}}: warning: 'CLI_MACRO' macro redefined +// CHECK: <command line>{{.+}}: note: previous definition is here + +#define REGULAR_MACRO +#define REGULAR_MACRO 1 +// CHECK: macro_redefined.S{{.+}}: warning: 'REGULAR_MACRO' macro redefined +// CHECK: macro_redefined.S{{.+}}: note: previous definition is here Index: clang/test/Preprocessor/directives_asm.S =================================================================== --- /dev/null +++ clang/test/Preprocessor/directives_asm.S @@ -0,0 +1,25 @@ +// RUN: %clang -c %s -o /dev/null 2>&1 | FileCheck %s + +// Check that preprocessor directives are recognised as such, but lines starting +// with a # that aren't directives are instead treated as comments. + +#define MACRO .warning "This is a macro" + MACRO + +// CHECK: directives_asm.S:7:9: warning: This is a macro + +#not a preprocessing directive + +// CHECK-NOT: error: invalid preprocessing directive + +# 100 + + .warning "line number should not change" + +// CHECK: directives_asm.S:17:9: warning: line number should not change + +#line 100 + + .warning "line number should change" + +// CHECK: directives_asm.S:101:9: warning: line number should change Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1185,8 +1185,12 @@ CurPPLexer->getConditionalStackDepth() > 0); return; case tok::numeric_constant: // # 7 GNU line marker directive. - if (getLangOpts().AsmPreprocessor) - break; // # 4 is not a preprocessor directive in .S files. + // In a .S file "# 4" may be a comment so don't treat it as a preprocessor + // directive. However do permit it in the predefines file, as we use line + // markers to mark the builtin macros as being in a system header. + if (getLangOpts().AsmPreprocessor && + SourceMgr.getFileID(SavedHash.getLocation()) != getPredefinesFileID()) + break; return HandleDigitDirective(Result); default: IdentifierInfo *II = Result.getIdentifierInfo(); Index: clang/lib/Frontend/InitPreprocessor.cpp =================================================================== --- clang/lib/Frontend/InitPreprocessor.cpp +++ clang/lib/Frontend/InitPreprocessor.cpp @@ -1317,11 +1317,10 @@ llvm::raw_string_ostream Predefines(PredefineBuffer); MacroBuilder Builder(Predefines); - // Emit line markers for various builtin sections of the file. We don't do - // this in asm preprocessor mode, because "# 4" is not a line marker directive - // in this mode. - if (!PP.getLangOpts().AsmPreprocessor) - Builder.append("# 1 \"<built-in>\" 3"); + // Emit line markers for various builtin sections of the file. The 3 here + // marks <built-in> as being a system header, which suppresses warnings when + // the same macro is defined multiple times. + Builder.append("# 1 \"<built-in>\" 3"); // Install things like __POWERPC__, __GNUC__, etc into the macro table. if (InitOpts.UsePredefines) { @@ -1359,8 +1358,7 @@ // Add on the predefines from the driver. Wrap in a #line directive to report // that they come from the command line. - if (!PP.getLangOpts().AsmPreprocessor) - Builder.append("# 1 \"<command line>\" 1"); + Builder.append("# 1 \"<command line>\" 1"); // Process #define's and #undef's in the order they are given. for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) { @@ -1372,8 +1370,7 @@ } // Exit the command line and go back to <built-in> (2 is LC_LEAVE). - if (!PP.getLangOpts().AsmPreprocessor) - Builder.append("# 1 \"<built-in>\" 2"); + Builder.append("# 1 \"<built-in>\" 2"); // If -imacros are specified, include them now. These are processed before // any -include directives.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits