[PATCH] ms-inline-asm: Add facilities for rewriting labels in X86AsmParser
Reid Kleckner
rnk at google.com
Thu Sep 18 09:07:15 PDT 2014
lgtm
================
Comment at: lib/MC/MCParser/AsmParser.cpp:4620
@@ +4619,3 @@
+ case AOK_Identifier:
+ OS << AR.Identifier;
+ break;
----------------
ehsan wrote:
> rnk wrote:
> > This should really be making an local label that doesn't make it into the object file. MC should know what the local label prefix is. It's usually 'L', I think.
> >
> > If you add the prefix here, then maybe this should be AOK_Label or something.
> What do you mean by a local label? I don't think that something that doesn't make it into the object file is what we want here. For example, MSVC creates a relocation to $label$1 in this test case:
>
> void f() {
> __asm {
> label:
> mov eax, label
> }
> }
Hm, true. I think MC will make a relocation for this as well even if you use the private prefix.
================
Comment at: lib/Target/X86/AsmParser/X86AsmParser.cpp:1305
@@ +1304,3 @@
+
+ // If the identifier lookup was unsuccessful, assume that we are dealing with
+ // a label.
----------------
ehsan wrote:
> rnk wrote:
> > What does MSVC do in this case? I assume it uses the opposite logic for this code:
> >
> > void foo();
> > void __declspec(naked) bar() {
> > __asm {
> > foo:
> > jmp foo ; probably infinite loops instead of tail calling bar.
> > }
> > }
> >
> > I guess this is the hard case:
> >
> > void foo();
> > void __declspec(naked) bar() {
> > __asm {
> > test ecx, ecx
> > xor eax, eax
> > jz foo
> > mov eax 1
> > foo:
> > ret
> > }
> The first case is turned into:
>
> _bar:
> 0: e9 00 00 00 00 jmp 0
> 00000001: IMAGE_REL_I386_REL32 _foo
>
> The second case is turned into:
>
> _bar:
> 0: 85 c9 testl %ecx, %ecx
> 2: 33 c0 xorl %eax, %eax
> 4: 0f 84 00 00 00 00 je 0
> 00000006: IMAGE_REL_I386_REL32 _foo
> a: b8 01 00 00 00 movl $1, %eax
> f: c3 retl
>
> My patch compiles the first case into:
>
> _bar:
> 0: b8 00 00 00 00 movl $0, %eax
> 1: IMAGE_REL_I386_DIR32 _foo
>
> __MSASMLABEL_.0__:
> 5: ff e0 jmpl *%eax
> 7: c3 ret
>
> And the second case into:
>
> _bar:
> 0: 85 c9 testl %ecx, %ecx
> 2: 31 c0 xorl %eax, %eax
> 4: 0f 84 00 00 00 00 je 0
> 6: IMAGE_REL_I386_REL32 foo
> a: b8 01 00 00 00 movl $1, %eax
>
> __MSASMLABEL_.0__:
> f: c3 ret
> 10: c3 ret
>
> Is that good (enough)?
Huh, so they pick global functions before local labels, and so do we. Seems fine then.
http://reviews.llvm.org/D4587
More information about the llvm-commits
mailing list