r293004 - Use filename in linemarker when compiling preprocessed source
Diana Picus via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 24 23:39:08 PST 2017
Erm, the revert was actually r293032, sorry about the confusion.
On 25 January 2017 at 09:34, Diana Picus <diana.picus at linaro.org> wrote:
> 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