mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
wire up support for emitting "special" values from inline asm
format strings with the standard ${:foo} syntax. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66527 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3328adda6b
commit
3e0cc2634e
@ -176,7 +176,7 @@ namespace llvm {
|
||||
/// or other bits of target-specific knowledge into the asmstrings. The
|
||||
/// syntax used is ${:comment}. Targets can override this to add support
|
||||
/// for their own strange codes.
|
||||
virtual void PrintSpecial(const MachineInstr *MI, const char *Code);
|
||||
virtual void PrintSpecial(const MachineInstr *MI, const char *Code) const;
|
||||
|
||||
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
|
||||
/// instruction, using the specified assembler variant. Targets should
|
||||
|
@ -1185,7 +1185,7 @@ void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
|
||||
/// or other bits of target-specific knowledge into the asmstrings. The
|
||||
/// syntax used is ${:comment}. Targets can override this to add support
|
||||
/// for their own strange codes.
|
||||
void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) {
|
||||
void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
|
||||
if (!strcmp(Code, "private")) {
|
||||
O << TAI->getPrivateGlobalPrefix();
|
||||
} else if (!strcmp(Code, "comment")) {
|
||||
@ -1307,6 +1307,25 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
|
||||
HasCurlyBraces = true;
|
||||
}
|
||||
|
||||
// If we have ${:foo}, then this is not a real operand reference, it is a
|
||||
// "magic" string reference, just like in .td files. Arrange to call
|
||||
// PrintSpecial.
|
||||
if (HasCurlyBraces && *LastEmitted == ':') {
|
||||
++LastEmitted;
|
||||
const char *StrStart = LastEmitted;
|
||||
const char *StrEnd = strchr(StrStart, '}');
|
||||
if (StrEnd == 0) {
|
||||
cerr << "Unterminated ${:foo} operand in inline asm string: '"
|
||||
<< AsmStr << "'\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
std::string Val(StrStart, StrEnd);
|
||||
PrintSpecial(MI, Val.c_str());
|
||||
LastEmitted = StrEnd+1;
|
||||
break;
|
||||
}
|
||||
|
||||
const char *IDStart = LastEmitted;
|
||||
char *IDEnd;
|
||||
errno = 0;
|
||||
|
6
test/CodeGen/Generic/inline-asm-special-strings.ll
Normal file
6
test/CodeGen/Generic/inline-asm-special-strings.ll
Normal file
@ -0,0 +1,6 @@
|
||||
; RUN: llvm-as < %s | llc | grep "foo 0 0"
|
||||
|
||||
define void @bar() nounwind {
|
||||
tail call void asm sideeffect "foo ${:uid} ${:uid}", ""() nounwind
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user