diff options
Diffstat (limited to 'clang/lib/Frontend')
| -rw-r--r-- | clang/lib/Frontend/ASTUnit.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 24 | ||||
| -rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Frontend/TextDiagnostic.cpp | 76 | 
4 files changed, 78 insertions, 34 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 6cc7094..1169acb 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -518,14 +518,14 @@ class ASTInfoCollector : public ASTReaderListener {    LangOptions &LangOpts;    CodeGenOptions &CodeGenOpts;    TargetOptions &TargetOpts; -  unsigned &Counter; +  uint32_t &Counter;  public:    ASTInfoCollector(HeaderSearchOptions &HSOpts,                     std::string &SpecificModuleCachePath,                     PreprocessorOptions &PPOpts, LangOptions &LangOpts,                     CodeGenOptions &CodeGenOpts, TargetOptions &TargetOpts, -                   unsigned &Counter) +                   uint32_t &Counter)        : HSOpts(HSOpts), SpecificModuleCachePath(SpecificModuleCachePath),          PPOpts(PPOpts), LangOpts(LangOpts), CodeGenOpts(CodeGenOpts),          TargetOpts(TargetOpts), Counter(Counter) {} @@ -577,7 +577,7 @@ public:    }    void ReadCounter(const serialization::ModuleFile &M, -                   unsigned NewCounter) override { +                   uint32_t NewCounter) override {      Counter = NewCounter;    }  }; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 1951e7f..be7c1d3 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4049,18 +4049,18 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,    // -cl-std only applies for OpenCL language standards.    // Override the -std option in this case.    if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) { -    LangStandard::Kind OpenCLLangStd -      = llvm::StringSwitch<LangStandard::Kind>(A->getValue()) -        .Cases("cl", "CL", LangStandard::lang_opencl10) -        .Cases("cl1.0", "CL1.0", LangStandard::lang_opencl10) -        .Cases("cl1.1", "CL1.1", LangStandard::lang_opencl11) -        .Cases("cl1.2", "CL1.2", LangStandard::lang_opencl12) -        .Cases("cl2.0", "CL2.0", LangStandard::lang_opencl20) -        .Cases("cl3.0", "CL3.0", LangStandard::lang_opencl30) -        .Cases("clc++", "CLC++", LangStandard::lang_openclcpp10) -        .Cases("clc++1.0", "CLC++1.0", LangStandard::lang_openclcpp10) -        .Cases("clc++2021", "CLC++2021", LangStandard::lang_openclcpp2021) -        .Default(LangStandard::lang_unspecified); +    LangStandard::Kind OpenCLLangStd = +        llvm::StringSwitch<LangStandard::Kind>(A->getValue()) +            .Cases({"cl", "CL"}, LangStandard::lang_opencl10) +            .Cases({"cl1.0", "CL1.0"}, LangStandard::lang_opencl10) +            .Cases({"cl1.1", "CL1.1"}, LangStandard::lang_opencl11) +            .Cases({"cl1.2", "CL1.2"}, LangStandard::lang_opencl12) +            .Cases({"cl2.0", "CL2.0"}, LangStandard::lang_opencl20) +            .Cases({"cl3.0", "CL3.0"}, LangStandard::lang_opencl30) +            .Cases({"clc++", "CLC++"}, LangStandard::lang_openclcpp10) +            .Cases({"clc++1.0", "CLC++1.0"}, LangStandard::lang_openclcpp10) +            .Cases({"clc++2021", "CLC++2021"}, LangStandard::lang_openclcpp2021) +            .Default(LangStandard::lang_unspecified);      if (OpenCLLangStd == LangStandard::lang_unspecified) {        Diags.Report(diag::err_drv_invalid_value) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 8602be1..b88d9f8 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1516,6 +1516,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    if (LangOpts.PointerAuthIntrinsics)      Builder.defineMacro("__PTRAUTH__"); +  if (CGOpts.Dwarf2CFIAsm) +    Builder.defineMacro("__GCC_HAVE_DWARF2_CFI_ASM"); +    // Get other target #defines.    TI.getTargetDefines(LangOpts, Builder);  } @@ -1542,6 +1545,9 @@ void clang::InitializePreprocessor(Preprocessor &PP,    llvm::raw_string_ostream Predefines(PredefineBuffer);    MacroBuilder Builder(Predefines); +  // Ensure that the initial value of __COUNTER__ is hooked up. +  PP.setCounterValue(InitOpts.InitialCounterValue); +    // 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. diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index aea3e72..1003218 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -349,14 +349,13 @@ private:  /// When the source code line we want to print is too long for  /// the terminal, select the "interesting" region. -static void selectInterestingSourceRegion(std::string &SourceLine, -                                          std::string &CaretLine, -                                          std::string &FixItInsertionLine, -                                          Columns NonGutterColumns, -                                          const SourceColumnMap &Map) { -  Columns CaretColumns = Columns(CaretLine.size()); -  Columns FixItColumns = -      Columns(llvm::sys::locale::columnWidth(FixItInsertionLine)); +static void selectInterestingSourceRegion( +    std::string &SourceLine, std::string &CaretLine, +    std::string &FixItInsertionLine, Columns NonGutterColumns, +    const SourceColumnMap &Map, +    SmallVectorImpl<clang::TextDiagnostic::StyleRange> &Styles) { +  Columns CaretColumns = CaretLine.size(); +  Columns FixItColumns = llvm::sys::locale::columnWidth(FixItInsertionLine);    Columns MaxColumns =        std::max({Map.columns().V, CaretColumns.V, FixItColumns.V});    // if the number of columns is less than the desired number we're done @@ -369,13 +368,11 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    // Find the slice that we need to display the full caret line    // correctly.    Columns CaretStart = 0, CaretEnd = CaretLine.size(); -  for (; CaretStart != CaretEnd; CaretStart = CaretStart.next()) -    if (!isWhitespace(CaretLine[CaretStart.V])) -      break; +  while (CaretStart != CaretEnd && isWhitespace(CaretLine[CaretStart.V])) +    CaretStart = CaretStart.next(); -  for (; CaretEnd != CaretStart; CaretEnd = CaretEnd.prev()) -    if (!isWhitespace(CaretLine[CaretEnd.V - 1])) -      break; +  while (CaretEnd != CaretStart && isWhitespace(CaretLine[CaretEnd.V])) +    CaretEnd = CaretEnd.prev();    // caret has already been inserted into CaretLine so the above whitespace    // check is guaranteed to include the caret @@ -516,13 +513,45 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    assert(FrontColumnsRemoved + ColumnsKept + BackColumnsRemoved >           NonGutterColumns); +  // Since we've modified the SourceLine, we also need to adjust the line's +  // highlighting information. In particular, if we've removed +  // from the front of the line, we need to move the style ranges to the +  // left and remove unneeded ranges. +  // Note in particular that variables like CaretEnd are defined in the +  // CaretLine, which only contains ASCII, while the style ranges are defined in +  // the source line, where we have to care for the byte-index != column-index +  // case. +  Bytes BytesRemoved = +      FrontColumnsRemoved > FrontEllipse.size() +          ? (Map.columnToByte(FrontColumnsRemoved) - Bytes(FrontEllipse.size())) +          : 0; +  Bytes CodeEnd = +      CaretEnd < Map.columns() ? Map.columnToByte(CaretEnd.V) : CaretEnd.V; +  for (TextDiagnostic::StyleRange &R : Styles) { +    // Remove style ranges before and after the new truncated snippet. +    if (R.Start >= static_cast<unsigned>(CodeEnd.V) || +        R.End < static_cast<unsigned>(BytesRemoved.V)) { +      R.Start = R.End = std::numeric_limits<int>::max(); +      continue; +    } +    // Move them left. (Note that this can wrap R.Start, but that doesn't +    // matter). +    R.Start -= BytesRemoved.V; +    R.End -= BytesRemoved.V; + +    // Don't leak into the ellipse at the end. +    if (R.Start < static_cast<unsigned>(CodeEnd.V) && +        R.End > static_cast<unsigned>(CodeEnd.V)) +      R.End = CodeEnd.V + 1; // R.End is inclusive. +  } +    // The line needs some truncation, and we'd prefer to keep the front    //  if possible, so remove the back    if (BackColumnsRemoved > Columns(BackEllipse.size()))      SourceLine.replace(SourceEnd.V, std::string::npos, BackEllipse);    // If that's enough then we're done -  if (FrontColumnsRemoved + ColumnsKept <= Columns(NonGutterColumns)) +  if (FrontColumnsRemoved + ColumnsKept <= NonGutterColumns)      return;    // Otherwise remove the front as well @@ -1391,6 +1420,11 @@ void TextDiagnostic::emitSnippetAndCaret(        OS.indent(MaxLineNoDisplayWidth + 2) << "| ";    }; +  Columns MessageLength = DiagOpts.MessageLength; +  // If we don't have enough columns available, just abort now. +  if (MessageLength != 0 && MessageLength <= Columns(MaxLineNoDisplayWidth + 4)) +    return; +    // Prepare source highlighting information for the lines we're about to    // emit, starting from the first line.    std::unique_ptr<SmallVector<StyleRange>[]> SourceStyles = @@ -1450,10 +1484,14 @@ void TextDiagnostic::emitSnippetAndCaret(      // If the source line is too long for our terminal, select only the      // "interesting" source region within that line. -    Columns MessageLength = DiagOpts.MessageLength; -    if (MessageLength.V != 0) +    if (MessageLength != 0) { +      Columns NonGutterColumns = MessageLength; +      if (MaxLineNoDisplayWidth != 0) +        NonGutterColumns -= Columns(MaxLineNoDisplayWidth + 4);        selectInterestingSourceRegion(SourceLine, CaretLine, FixItInsertionLine, -                                    MessageLength, SourceColMap); +                                    NonGutterColumns, SourceColMap, +                                    SourceStyles[LineNo - Lines.first]); +    }      // If we are in -fdiagnostics-print-source-range-info mode, we are trying      // to produce easily machine parsable output.  Add a space before the @@ -1508,7 +1546,7 @@ void TextDiagnostic::emitSnippet(StringRef SourceLine,    // Print the source line one character at a time.    bool PrintReversed = false;    std::optional<llvm::raw_ostream::Colors> CurrentColor; -  size_t I = 0; +  size_t I = 0; // Bytes.    while (I < SourceLine.size()) {      auto [Str, WasPrintable] =          printableTextForNextCharacter(SourceLine, &I, DiagOpts.TabStop);  | 
