From ce1b9ad539e67c6d05cc6b47ca5f6e62a6d91eff Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 17 Nov 2010 08:20:42 +0000 Subject: [PATCH] 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" ^ :2:1: note: instantiated into assembly here .code32 ^ now we get: t.c:5:8: error: warning: ignoring directive for now ".code32\n" ^ :2:1: note: instantiated into assembly here .code32 ^ Note that we're pointing to line 5 properly now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119488 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.html | 7 ++++--- lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp | 14 +++++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/LangRef.html b/docs/LangRef.html index f15f139aeb3..1c31e453369 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -2625,8 +2625,8 @@ call void asm alignstack "eieio", ""()

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:

@@ -2638,7 +2638,8 @@ call void asm sideeffect "something bad", ""(), !srcloc !42

It is up to the front-end to make sense of the magic numbers it places in the - IR.

+ 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.

diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp index 9e5d679aa3c..ff9ecf2dbd0 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -49,11 +49,19 @@ static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo) { SrcMgrDiagInfo *DiagInfo = static_cast(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(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(LocInfo->getOperand(ErrorLine))) LocCookie = CI->getZExtValue(); + } DiagInfo->DiagHandler(Diag, DiagInfo->DiagContext, LocCookie); }