]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: encode BLX directly, fixes one clang build error on arm
authorDave Cheney <dave@cheney.net>
Wed, 22 Oct 2014 01:30:15 +0000 (12:30 +1100)
committerDave Cheney <dave@cheney.net>
Wed, 22 Oct 2014 01:30:15 +0000 (12:30 +1100)
Fixes #8348.

Trying to work around clang's dodgy support for .arch by reverting to the external assembler didn't work out so well. Minux had a much better solution to encode the instructions we need as .word directives which avoids .arch altogether.

I've confirmed with gdb that this form produces the expected machine code

Dump of assembler code for function crosscall_arm1:
   0x00000000 <+0>: push {r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}
   0x00000004 <+4>: mov r4, r0
   0x00000008 <+8>: mov r5, r1
   0x0000000c <+12>: mov r0, r2
   0x00000010 <+16>: blx r5
   0x00000014 <+20>: blx r4
   0x00000018 <+24>: pop {r4, r5, r6, r7, r8, r9, r10, r11, r12, pc}

There is another compilation failure that blocks building Go with clang on arm

# ../misc/cgo/test
# _/home/dfc/go/misc/cgo/test
/tmp/--407b12.s: Assembler messages:
/tmp/--407b12.s:59: Error: selected processor does not support ARM mode `blx r0'
clang: error: assembler command failed with exit code 1 (use -v to see invocation)
FAIL _/home/dfc/go/misc/cgo/test [build failed]

I'll open a new issue for that

LGTM=iant
R=iant, minux
CC=golang-codereviews
https://golang.org/cl/158180047

src/runtime/cgo/gcc_arm.S

index 2e4b3528ba29d62179f75739933c8e724a4248bb..d5833bfad01bdc8445fe6cd0a7c51fdd09d03776 100644 (file)
 #define EXT(s) s
 #endif
 
-/*
- * Because the assembler might target an earlier revision of the ISA
- * by default, we must explicitly specify the ISA revision to ensure
- * BLX is recognized as a valid instruction.
- */    
-.arch armv5t
-
 /*
  * void crosscall_arm1(void (*fn)(void), void (*setg_gcc)(void *g), void *g)
  *
@@ -31,8 +24,12 @@ EXT(crosscall_arm1):
        mov r4, r0
        mov r5, r1
        mov r0, r2
-       blx r5 // setg(g) 
-       blx r4 // fn() 
+
+       // Because the assembler might target an earlier revision of the ISA
+       // by default, we encode BLX as a .word.
+       .word 0xe12fff35 // blx r5 // setg(g)
+       .word 0xe12fff34 // blx r4 // fn()
+
        pop {r4, r5, r6, r7, r8, r9, r10, r11, ip, pc}
 
 .globl EXT(__stack_chk_fail_local)