mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +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,
|
||||
etc need to be documented). This is probably best done by reference to
|
||||
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>
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#define DEBUG_TYPE "asm-printer"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/InlineAsm.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Module.h"
|
||||
@ -97,7 +98,7 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
|
||||
unsigned NumDefs = 0;
|
||||
for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef();
|
||||
++NumDefs)
|
||||
assert(NumDefs != NumOperands-1 && "No asm string?");
|
||||
assert(NumDefs != NumOperands-2 && "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()+
|
||||
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
|
||||
// EmitInlineAsm.
|
||||
SmallString<256> StringData;
|
||||
@ -295,7 +305,7 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
|
||||
}
|
||||
}
|
||||
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
|
||||
// enabled, so we use EmitRawText.
|
||||
|
@ -769,6 +769,12 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user