rearrange how the handler in SourceMgr is installed, eliminating the use of
authorChris Lattner <sabre@nondot.org>
Wed, 17 Nov 2010 08:03:32 +0000 (08:03 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Nov 2010 08:03:32 +0000 (08:03 +0000)
the cookie argument to setDiagHandler

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119483 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp

index 861f738e5d3863b3012cccbc4d430c893fd54f77..25ce25c325ef0670fdc0c5c3a30603f23862f9e3 100644 (file)
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
 
+namespace {
+  struct SrcMgrDiagInfo {
+    const MDNode *LocInfo;
+    void *DiagHandler;
+    void *DiagContext;
+  };
+}
+
+/// SrcMgrDiagHandler - This callback is invoked when the SourceMgr for an
+/// inline asm has an error in it.  diagInfo is a pointer to the SrcMgrDiagInfo
+/// struct above.
+static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo,
+                              unsigned locCookie) {
+  SrcMgrDiagInfo *DiagInfo = static_cast<SrcMgrDiagInfo *>(diagInfo);
+  assert(DiagInfo && "Diagnostic context not passed down?");
+  
+  unsigned LocCookie = 0;
+  if (const MDNode *LocInfo = DiagInfo->LocInfo) 
+    if (LocInfo->getNumOperands() > 0)
+      if (const ConstantInt *CI = dyn_cast<ConstantInt>(LocInfo->getOperand(0)))
+        LocCookie = CI->getZExtValue();
+  
+  SourceMgr::DiagHandlerTy ChainHandler = 
+    (SourceMgr::DiagHandlerTy)(intptr_t)DiagInfo->DiagHandler;
+  
+  ChainHandler(Diag, DiagInfo->DiagContext, LocCookie);
+}
+
 /// EmitInlineAsm - Emit a blob of inline asm to the output streamer.
 void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode) const {
   assert(!Str.empty() && "Can't emit empty inline asm block");
@@ -52,19 +80,18 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode) const {
   }
 
   SourceMgr SrcMgr;
+  SrcMgrDiagInfo DiagInfo;
 
   // If the current LLVMContext has an inline asm handler, set it in SourceMgr.
   LLVMContext &LLVMCtx = MMI->getModule()->getContext();
   bool HasDiagHandler = false;
   if (void *DiagHandler = LLVMCtx.getInlineAsmDiagnosticHandler()) {
-    unsigned LocCookie = 0;
-    if (LocMDNode && LocMDNode->getNumOperands() > 0)
-      if (const ConstantInt *CI =
-            dyn_cast<ConstantInt>(LocMDNode->getOperand(0)))
-        LocCookie = CI->getZExtValue();
-    
-    SrcMgr.setDiagHandler((SourceMgr::DiagHandlerTy)(intptr_t)DiagHandler,
-                          LLVMCtx.getInlineAsmDiagnosticContext(), LocCookie);
+    // If the source manager has an issue, we arrange for SrcMgrDiagHandler
+    // to be invoked, getting DiagInfo passed into it.
+    DiagInfo.LocInfo = LocMDNode;
+    DiagInfo.DiagHandler = DiagHandler;
+    DiagInfo.DiagContext = LLVMCtx.getInlineAsmDiagnosticContext();
+    SrcMgr.setDiagHandler(SrcMgrDiagHandler, &DiagInfo);
     HasDiagHandler = true;
   }