[PATCH] D114329: [asm] Allow labels as operands in intel asm syntax
Nico Weber via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 20 19:12:15 PST 2021
thakis created this revision.
thakis added a reviewer: hans.
Herald added subscribers: pengfei, hiraditya.
thakis requested review of this revision.
Herald added a project: LLVM.
This makes a line in llvm/test/CodeGen/X86/asm-block-labels.ll pass
with `asm inteldialect` too.
I don't know if this is something one can hit in practice with inline
asm. The test is from 2007 (4646aa3e337aa) but in 2009 blockaddr was
introduced and e.g. `__asm__ __volatile__("brl %0" :: "X"(&&foo) : "memory");`
compiles to
call void asm sideeffect "brl $0", "X,..."(i8* blockaddress(@func, %1))
nowadays (thanks to jrtc27 for that example!).
(6c4d255bf3d64 switched clang to blockaddress on an opt-in basis,
e4801f7844bb added docs for it, 31b132c0b781 added IR support.)
I half-heartedly tried to build clang 2.8 locally, but it didn't
just build. And 2.8 didn't have a prebuilt clang binary yet.
The motivation is to make EmitGCCInlineAsmStr() and EmitMSInlineAsmStr()
more alike, and maybe we should delete this code form EmitGCCInlineAsmStr()
instead. But since it's just 3 lines and it's reachable from LLVM IR,
let's do the safer thing for now.
https://reviews.llvm.org/D114329
Files:
llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
llvm/test/CodeGen/X86/asm-block-labels.ll
Index: llvm/test/CodeGen/X86/asm-block-labels.ll
===================================================================
--- llvm/test/CodeGen/X86/asm-block-labels.ll
+++ llvm/test/CodeGen/X86/asm-block-labels.ll
@@ -39,3 +39,12 @@
return: ; preds = %"LASM$foo"
ret void
}
+
+define void @quux() {
+entry:
+ call void asm sideeffect inteldialect "brl ${0:l}", "X,~{dirflag},~{fpsr},~{flags},~{memory}"( label %"LASM$foo" )
+ br label %"LASM$foo"
+
+"LASM$foo": ; preds = %entry
+ ret void
+}
Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
+++ llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
@@ -281,6 +281,9 @@
MCSymbol *Sym = AP->GetBlockAddressSymbol(BA);
Sym->print(OS, AP->MAI);
MMI->getContext().registerInlineAsmLabel(Sym);
+ } else if (MI->getOperand(OpNo).isMBB()) {
+ const MCSymbol *Sym = MI->getOperand(OpNo).getMBB()->getSymbol();
+ Sym->print(OS, AP->MAI);
} else if (InlineAsm::isMemKind(OpFlags)) {
Error = AP->PrintAsmMemoryOperand(
MI, OpNo, Modifier[0] ? Modifier : nullptr, OS);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114329.388737.patch
Type: text/x-patch
Size: 1251 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211121/27de2f29/attachment.bin>
More information about the llvm-commits
mailing list