[PATCH] MIR Serialization: Report diagnostics with correct locations for LLVM IR Errors.

Alex L arphaman at gmail.com
Thu May 28 16:54:11 PDT 2015


Thanks,
I will change the patch accordingly and commit it later on.

Alex.

2015-05-28 16:34 GMT-07:00 Duncan P. N. Exon Smith <dexonsmith at apple.com>:

>
> > On 2015-May-28, at 15:52, Alex Lorenz <arphaman at gmail.com> wrote:
> >
> > Hi dexonsmith, bob.wilson, bogner,
> >
> > This patch translates the line and column numbers from LLVM IR block
> string to the
> > line and column numbers in the MIR file so that llc reports LLVM IR
> errors with
> > correct locations.
> >
> > REPOSITORY
> >  rL LLVM
> >
> > http://reviews.llvm.org/D10108
> >
> > Files:
> >  lib/CodeGen/MIRParser/MIRParser.cpp
> >  test/CodeGen/MIR/llvm-ir-error-reported.mir
> >
> > Index: lib/CodeGen/MIRParser/MIRParser.cpp
> > ===================================================================
> > --- lib/CodeGen/MIRParser/MIRParser.cpp
> > +++ lib/CodeGen/MIRParser/MIRParser.cpp
> > @@ -18,6 +18,7 @@
> >  #include "llvm/AsmParser/Parser.h"
> >  #include "llvm/CodeGen/MIRYamlMapping.h"
> >  #include "llvm/IR/Module.h"
> > +#include "llvm/Support/LineIterator.h"
> >  #include "llvm/Support/SMLoc.h"
> >  #include "llvm/Support/SourceMgr.h"
> >  #include "llvm/Support/MemoryBuffer.h"
> > @@ -49,6 +50,11 @@
> >    ///
> >    /// Return true if an error occurred.
> >    bool parseMachineFunction(yaml::Input &In);
> > +
> > +private:
> > +  /// Return a MIR diagnostic converted from an LLVM assembly
> diagnostic.
> > +  SMDiagnostic diagFromLLVMAssemblyDiag(const SMDiagnostic &Error,
> > +                                        SMRange SourceRange);
> >  };
> >
> >  } // end anonymous namespace
> > @@ -81,8 +87,10 @@
> >            dyn_cast_or_null<yaml::BlockScalarNode>(In.getCurrentNode()))
> {
> >      M = parseAssembly(MemoryBufferRef(BSN->getValue(), Filename), Error,
> >                        Context);
> > -    if (!M)
> > +    if (!M) {
> > +      Error = diagFromLLVMAssemblyDiag(Error, BSN->getSourceRange());
> >        return M;
> > +    }
> >      In.nextDocument();
> >      if (!In.setCurrentDocument())
> >        return M;
> > @@ -111,6 +119,36 @@
> >    return false;
> >  }
> >
> > +SMDiagnostic MIRParserImpl::diagFromLLVMAssemblyDiag(const SMDiagnostic
> &Error,
> > +                                                     SMRange
> SourceRange) {
> > +  assert(SourceRange.isValid());
> > +
> > +  // Translate the location of the error from the location in the llvm
> IR string
> > +  // to the corresponding location in the MIR file.
> > +  auto LineAndColumn = SM.getLineAndColumn(SourceRange.Start);
> > +  unsigned Line = LineAndColumn.first + Error.getLineNo() - 1;
> > +  unsigned Column = Error.getColumnNo();
> > +  StringRef LineStr = Error.getLineContents();
> > +  SMLoc Loc = Error.getLoc();
> > +
> > +  // Get the full line and adjust the column number by taking the
> indentation of
> > +  // LLVM IR into account.
> > +  line_iterator Lines(*SM.getMemoryBuffer(SM.getMainFileID()), false);
> > +  while (!Lines.is_at_end() && Lines.line_number() != Line)
> > +    ++Lines;
> > +  if (Lines.line_number() == Line) {
> > +    LineStr = *Lines;
> > +    Loc = SMLoc::getFromPointer(LineStr.data());
> > +    auto Indent = LineStr.find(Error.getLineContents());
> > +    if (Indent != StringRef::npos)
> > +      Column += Indent;
> > +  }
>
> According to the `line_iterator` docs, calling `line_number()` isn't
> safe at EOF.  Your `if` statement looks like it could violate that.
>
> I think you should change this to use a standard iterator pattern, and
> only use the iterator when it's valid:
>
>     for (line_iterator L(*SM.getMemoryBuffer(SM.getMainFileID()), false),
> E;
>          L != E; ++L)
>       if (L.line_number() == Line) {
>         LineStr = *L;
>         Loc = SMLoc::getFromPointer(LineStr.data());
>         auto Indent = LineStr.find(Error.getLineContents());
>         if (Indent != StringRef::npos)
>           Column += Indent;
>         break;
>       }
>
> With that change, this LGTM.
>
> > +
> > +  return SMDiagnostic(SM, Loc, Filename, Line, Column, Error.getKind(),
> > +                      Error.getMessage(), LineStr, Error.getRanges(),
> > +                      Error.getFixIts());
> > +}
> > +
> >  std::unique_ptr<Module> llvm::parseMIRFile(StringRef Filename,
> >                                             SMDiagnostic &Error,
> >                                             LLVMContext &Context) {
> > Index: test/CodeGen/MIR/llvm-ir-error-reported.mir
> > ===================================================================
> > --- /dev/null
> > +++ test/CodeGen/MIR/llvm-ir-error-reported.mir
> > @@ -0,0 +1,22 @@
> > +# RUN: not llc -start-after branch-folder -stop-after branch-folder -o
> /dev/null %s 2>&1 | FileCheck %s
> > +# This test ensures an error is reported if the embedded LLVM IR
> contains an
> > +# error.
> > +
> > +--- |
> > +
> > +  ; CHECK: [[@LINE+3]]:15: error: use of undefined value '%a'
> > +  define i32 @foo(i32 %x, i32 %y) {
> > +    %z = alloca i32, align 4
> > +    store i32 %a, i32* %z, align 4
> > +    br label %Test
> > +  Test:
> > +    %m = load i32, i32* %z, align 4
> > +    %cond = icmp eq i32 %y, %m
> > +    br i1 %cond, label %IfEqual, label %IfUnequal
> > +  IfEqual:
> > +    ret i32 1
> > +  IfUnequal:
> > +    ret i32 0
> > +  }
> > +
> > +...
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150528/d67a4137/attachment.html>


More information about the llvm-commits mailing list