forked from OSchip/llvm-project
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:
parent
068f2ab10f
commit
79ffdc7581
|
@ -2625,8 +2625,8 @@ call void asm alignstack "eieio", ""()
|
|||
<div class="doc_text">
|
||||
|
||||
<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
|
||||
generator will use the integer as the location cookie value when report
|
||||
attached to it that contains a list of constant integers. If present, the
|
||||
code generator will use the integer as the location cookie value when report
|
||||
errors through the LLVMContext error reporting mechanisms. This allows a
|
||||
front-end to correlate backend errors that occur with inline asm back to the
|
||||
source code that produced it. For example:</p>
|
||||
|
@ -2638,7 +2638,8 @@ call void asm sideeffect "something bad", ""()<b>, !srcloc !42</b>
|
|||
</pre>
|
||||
|
||||
<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>
|
||||
|
||||
|
|
|
@ -49,11 +49,19 @@ static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo) {
|
|||
SrcMgrDiagInfo *DiagInfo = static_cast<SrcMgrDiagInfo *>(diagInfo);
|
||||
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;
|
||||
if (const MDNode *LocInfo = DiagInfo->LocInfo)
|
||||
if (LocInfo->getNumOperands() > 0)
|
||||
if (const ConstantInt *CI = dyn_cast<ConstantInt>(LocInfo->getOperand(0)))
|
||||
if (const MDNode *LocInfo = DiagInfo->LocInfo) {
|
||||
unsigned ErrorLine = Diag.getLineNo()-1;
|
||||
if (ErrorLine >= LocInfo->getNumOperands())
|
||||
ErrorLine = 0;
|
||||
|
||||
if (LocInfo->getNumOperands() != 0)
|
||||
if (const ConstantInt *CI =
|
||||
dyn_cast<ConstantInt>(LocInfo->getOperand(ErrorLine)))
|
||||
LocCookie = CI->getZExtValue();
|
||||
}
|
||||
|
||||
DiagInfo->DiagHandler(Diag, DiagInfo->DiagContext, LocCookie);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue