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