With the newly simplified SourceMgr interfaces and the generalized

SrcMgrDiagHandler, we can improve clang diagnostics for inline asm:
instead of reporting them on a source line of the original line,
we can report it on the correct line wherever the string literal came
from. For something like this:

void foo() {
  asm("push %rax\n"
      ".code32\n");
}

we used to get this: (note that the line in t.c isn't helpful)

t.c:4:7: error: warning: ignoring directive for now
  asm("push %rax\n"
      ^
<inline asm>:2:1: note: instantiated into assembly here
.code32
^

now we get:

t.c:5:8: error: warning: ignoring directive for now
      ".code32\n"
       ^
<inline asm>:2:1: note: instantiated into assembly here
.code32
^

Note that we're pointing to line 5 properly now.

llvm-svn: 119488
This commit is contained in:
Chris Lattner 2010-11-17 08:20:42 +00:00
parent 068f2ab10f
commit 79ffdc7581
2 changed files with 15 additions and 6 deletions

View File

@ -2625,8 +2625,8 @@ call void asm alignstack "eieio", ""()
<div class="doc_text"> <div class="doc_text">
<p>The call instructions that wrap inline asm nodes may have a "!srcloc" MDNode <p>The call instructions that wrap inline asm nodes may have a "!srcloc" MDNode
attached to it that contains a constant integer. If present, the code attached to it that contains a list of constant integers. If present, the
generator will use the integer as the location cookie value when report code generator will use the integer as the location cookie value when report
errors through the LLVMContext error reporting mechanisms. This allows a errors through the LLVMContext error reporting mechanisms. This allows a
front-end to correlate backend errors that occur with inline asm back to the front-end to correlate backend errors that occur with inline asm back to the
source code that produced it. For example:</p> source code that produced it. For example:</p>
@ -2638,7 +2638,8 @@ call void asm sideeffect "something bad", ""()<b>, !srcloc !42</b>
</pre> </pre>
<p>It is up to the front-end to make sense of the magic numbers it places in the <p>It is up to the front-end to make sense of the magic numbers it places in the
IR.</p> IR. If the MDNode contains multiple constants, the code generator will use
the one that corresponds to the line of the asm that the error occurs on.</p>
</div> </div>

View File

@ -49,11 +49,19 @@ static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo) {
SrcMgrDiagInfo *DiagInfo = static_cast<SrcMgrDiagInfo *>(diagInfo); SrcMgrDiagInfo *DiagInfo = static_cast<SrcMgrDiagInfo *>(diagInfo);
assert(DiagInfo && "Diagnostic context not passed down?"); assert(DiagInfo && "Diagnostic context not passed down?");
// If the inline asm had metadata associated with it, pull out a location
// cookie corresponding to which line the error occurred on.
unsigned LocCookie = 0; unsigned LocCookie = 0;
if (const MDNode *LocInfo = DiagInfo->LocInfo) if (const MDNode *LocInfo = DiagInfo->LocInfo) {
if (LocInfo->getNumOperands() > 0) unsigned ErrorLine = Diag.getLineNo()-1;
if (const ConstantInt *CI = dyn_cast<ConstantInt>(LocInfo->getOperand(0))) if (ErrorLine >= LocInfo->getNumOperands())
ErrorLine = 0;
if (LocInfo->getNumOperands() != 0)
if (const ConstantInt *CI =
dyn_cast<ConstantInt>(LocInfo->getOperand(ErrorLine)))
LocCookie = CI->getZExtValue(); LocCookie = CI->getZExtValue();
}
DiagInfo->DiagHandler(Diag, DiagInfo->DiagContext, LocCookie); DiagInfo->DiagHandler(Diag, DiagInfo->DiagContext, LocCookie);
} }