mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Have the inst emitter add the !srcloc mdnode to the machine instr.
Have the asmprinter use the mdnode to scavenge a source location if present. Document this nonsense in langref. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100607 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fee455ea6a
commit
cf9a415182
@ -2516,6 +2516,31 @@ call void asm alignstack "eieio", ""()
|
|||||||
documented here. Constraints on what can be done (e.g. duplication, moving,
|
documented here. Constraints on what can be done (e.g. duplication, moving,
|
||||||
etc need to be documented). This is probably best done by reference to
|
etc need to be documented). This is probably best done by reference to
|
||||||
another document that covers inline asm from a holistic perspective.</p>
|
another document that covers inline asm from a holistic perspective.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="doc_subsubsection">
|
||||||
|
<a name="inlineasm_md">Inline Asm Metadata</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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
|
||||||
|
errors through the LLVMContext error reporting mechanisms. This allows a
|
||||||
|
front-end to corrolate backend errors that occur with inline asm back to the
|
||||||
|
source code that produced it. For example:</p>
|
||||||
|
|
||||||
|
<div class="doc_code">
|
||||||
|
<pre>
|
||||||
|
call void asm sideeffect "something bad", ""()<b>, !srcloc !42</b>
|
||||||
|
...
|
||||||
|
!42 = !{ i32 1234567 }
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>It is up to the front-end to make sense of the magic numbers it places in the
|
||||||
|
IR.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#define DEBUG_TYPE "asm-printer"
|
#define DEBUG_TYPE "asm-printer"
|
||||||
#include "llvm/CodeGen/AsmPrinter.h"
|
#include "llvm/CodeGen/AsmPrinter.h"
|
||||||
|
#include "llvm/Constants.h"
|
||||||
#include "llvm/InlineAsm.h"
|
#include "llvm/InlineAsm.h"
|
||||||
#include "llvm/LLVMContext.h"
|
#include "llvm/LLVMContext.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
@ -97,7 +98,7 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
|
|||||||
unsigned NumDefs = 0;
|
unsigned NumDefs = 0;
|
||||||
for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef();
|
for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef();
|
||||||
++NumDefs)
|
++NumDefs)
|
||||||
assert(NumDefs != NumOperands-1 && "No asm string?");
|
assert(NumDefs != NumOperands-2 && "No asm string?");
|
||||||
|
|
||||||
assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?");
|
assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?");
|
||||||
|
|
||||||
@ -123,6 +124,15 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
|
|||||||
OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
|
OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
|
||||||
MAI->getInlineAsmStart());
|
MAI->getInlineAsmStart());
|
||||||
|
|
||||||
|
// Get the !srcloc metadata node if we have it, and decode the loc cookie from
|
||||||
|
// it.
|
||||||
|
unsigned LocCookie = 0;
|
||||||
|
if (const MDNode *SrcLoc = MI->getOperand(NumOperands-1).getMetadata()) {
|
||||||
|
if (SrcLoc->getNumOperands() != 0)
|
||||||
|
if (const ConstantInt *CI = dyn_cast<ConstantInt>(SrcLoc->getOperand(0)))
|
||||||
|
LocCookie = CI->getZExtValue();
|
||||||
|
}
|
||||||
|
|
||||||
// Emit the inline asm to a temporary string so we can emit it through
|
// Emit the inline asm to a temporary string so we can emit it through
|
||||||
// EmitInlineAsm.
|
// EmitInlineAsm.
|
||||||
SmallString<256> StringData;
|
SmallString<256> StringData;
|
||||||
@ -295,7 +305,7 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
OS << '\n' << (char)0; // null terminate string.
|
OS << '\n' << (char)0; // null terminate string.
|
||||||
EmitInlineAsm(OS.str(), 0/*no loc cookie*/);
|
EmitInlineAsm(OS.str(), LocCookie);
|
||||||
|
|
||||||
// Emit the #NOAPP end marker. This has to happen even if verbose-asm isn't
|
// Emit the #NOAPP end marker. This has to happen even if verbose-asm isn't
|
||||||
// enabled, so we use EmitRawText.
|
// enabled, so we use EmitRawText.
|
||||||
|
@ -769,6 +769,12 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the mdnode from the asm if it exists and add it to the instruction.
|
||||||
|
SDValue MDV = Node->getOperand(InlineAsm::Op_MDNode);
|
||||||
|
const MDNode *MD = cast<MDNodeSDNode>(MDV)->getMD();
|
||||||
|
MI->addOperand(MachineOperand::CreateMetadata(MD));
|
||||||
|
|
||||||
MBB->insert(InsertPos, MI);
|
MBB->insert(InsertPos, MI);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user