r293004 - Use filename in linemarker when compiling preprocessed source
Diana Picus via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 24 23:34:22 PST 2017
Hi David,
Sorry, but I had to revert this (r283029) because it was breaking the
non-x86 buildbots (arm, powerpc, hexagon), with errors along the lines
of:
error: unknown target CPU 'cortex-a8'
Please recommit after you've fixed the issue.
Thanks,
Diana
PS: I tried to fix it in r293024, but that broke on Green Dragon. I'll
let you come up with a more principled fix.
On 25 January 2017 at 03:55, David Callahan via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: david2050
> Date: Tue Jan 24 19:55:28 2017
> New Revision: 293004
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293004&view=rev
> Log:
> Use filename in linemarker when compiling preprocessed source
>
> Summary:
> Clang appears to always use name as specified on the command
> line, whereas gcc uses the name as specified in the linemarker at the
> first line when compiling a preprocessed source. This results mismatch
> between two compilers in FILE symbol table entry. This patch makes clang
> to resemble gcc's behavior in finding the original source file name and
> use it as an input file name.
>
> Even with this patch, values of FILE symbol table entry may still be
> different because clang uses dirname+basename for the entry whlie gcc
> uses basename only. I'll write a patch for that once this patch is
> committed.
>
> Reviewers: dblaikie, inglorion
>
> Reviewed By: inglorion
>
> Subscribers: inglorion, aprantl, bruno
>
> Differential Revision: https://reviews.llvm.org/D28796
>
> Added:
> cfe/trunk/test/Frontend/preprocessed-input.c
> Modified:
> cfe/trunk/include/clang/Frontend/FrontendOptions.h
> cfe/trunk/lib/Frontend/FrontendAction.cpp
>
> Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=293004&r1=293003&r2=293004&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original)
> +++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Tue Jan 24 19:55:28 2017
> @@ -81,7 +81,7 @@ enum InputKind {
> IK_LLVM_IR
> };
>
> -
> +
> /// \brief An input file for the front end.
> class FrontendInputFile {
> /// \brief The file name, or "-" to read from standard input.
> @@ -109,6 +109,13 @@ public:
> bool isEmpty() const { return File.empty() && Buffer == nullptr; }
> bool isFile() const { return !isBuffer(); }
> bool isBuffer() const { return Buffer != nullptr; }
> + bool isPreprocessed() const {
> + return Kind == IK_PreprocessedC ||
> + Kind == IK_PreprocessedCXX ||
> + Kind == IK_PreprocessedObjC ||
> + Kind == IK_PreprocessedObjCXX ||
> + Kind == IK_PreprocessedCuda;
> + }
>
> StringRef getFile() const {
> assert(isFile());
>
> Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=293004&r1=293003&r2=293004&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/FrontendAction.cpp (original)
> +++ cfe/trunk/lib/Frontend/FrontendAction.cpp Tue Jan 24 19:55:28 2017
> @@ -19,6 +19,7 @@
> #include "clang/Frontend/MultiplexConsumer.h"
> #include "clang/Frontend/Utils.h"
> #include "clang/Lex/HeaderSearch.h"
> +#include "clang/Lex/LiteralSupport.h"
> #include "clang/Lex/Preprocessor.h"
> #include "clang/Lex/PreprocessorOptions.h"
> #include "clang/Parse/ParseAST.h"
> @@ -187,6 +188,42 @@ FrontendAction::CreateWrappedASTConsumer
> return llvm::make_unique<MultiplexConsumer>(std::move(Consumers));
> }
>
> +// For preprocessed files, if the first line is the linemarker and specifies
> +// the original source file name, use that name as the input file name.
> +static bool ReadOriginalFileName(CompilerInstance &CI, std::string &InputFile)
> +{
> + bool Invalid = false;
> + auto &SourceMgr = CI.getSourceManager();
> + auto MainFileID = SourceMgr.getMainFileID();
> + const auto *MainFileBuf = SourceMgr.getBuffer(MainFileID, &Invalid);
> + if (Invalid)
> + return false;
> +
> + std::unique_ptr<Lexer> RawLexer(
> + new Lexer(MainFileID, MainFileBuf, SourceMgr, CI.getLangOpts()));
> +
> + // If the first line has the syntax of
> + //
> + // # NUM "FILENAME"
> + //
> + // we use FILENAME as the input file name.
> + Token T;
> + if (RawLexer->LexFromRawLexer(T) || T.getKind() != tok::hash)
> + return false;
> + if (RawLexer->LexFromRawLexer(T) || T.isAtStartOfLine() ||
> + T.getKind() != tok::numeric_constant)
> + return false;
> + RawLexer->LexFromRawLexer(T);
> + if (T.isAtStartOfLine() || T.getKind() != tok::string_literal)
> + return false;
> +
> + StringLiteralParser Literal(T, CI.getPreprocessor());
> + if (Literal.hadError)
> + return false;
> + InputFile = Literal.GetString().str();
> + return true;
> +}
> +
> bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
> const FrontendInputFile &Input) {
> assert(!Instance && "Already processing a source file!");
> @@ -335,6 +372,13 @@ bool FrontendAction::BeginSourceFile(Com
> if (!isModelParsingAction())
> CI.createASTContext();
>
> + // For preprocessed files, check if the first line specifies the original
> + // source file name with a linemarker.
> + std::string OrigFile;
> + if (Input.isPreprocessed())
> + if (ReadOriginalFileName(CI, OrigFile))
> + InputFile = OrigFile;
> +
> std::unique_ptr<ASTConsumer> Consumer =
> CreateWrappedASTConsumer(CI, InputFile);
> if (!Consumer)
> @@ -421,9 +465,9 @@ bool FrontendAction::BeginSourceFile(Com
>
> // If there is a layout overrides file, attach an external AST source that
> // provides the layouts from that file.
> - if (!CI.getFrontendOpts().OverrideRecordLayoutsFile.empty() &&
> + if (!CI.getFrontendOpts().OverrideRecordLayoutsFile.empty() &&
> CI.hasASTContext() && !CI.getASTContext().getExternalSource()) {
> - IntrusiveRefCntPtr<ExternalASTSource>
> + IntrusiveRefCntPtr<ExternalASTSource>
> Override(new LayoutOverrideSource(
> CI.getFrontendOpts().OverrideRecordLayoutsFile));
> CI.getASTContext().setExternalSource(Override);
>
> Added: cfe/trunk/test/Frontend/preprocessed-input.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/preprocessed-input.c?rev=293004&view=auto
> ==============================================================================
> --- cfe/trunk/test/Frontend/preprocessed-input.c (added)
> +++ cfe/trunk/test/Frontend/preprocessed-input.c Tue Jan 24 19:55:28 2017
> @@ -0,0 +1,4 @@
> +// RUN: %clang -E -o %t.i %s
> +// RUN: %clang -Xclang -triple -Xclang i686-linux-gnu -c -o %t.o %t.i
> +// RUN: llvm-objdump -t %t.o | FileCheck %s
> +// CHECK: l{{ +}}df{{ +}}*ABS*{{ +}}{{0+}}{{.+}}preprocessed-input.c{{$}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list