minio / c2goasm

C to Go Assembly
Apache License 2.0
1.31k stars 110 forks source link

linux gcc8 fun name error #11

Open zeromake opened 6 years ago

zeromake commented 6 years ago

env

problem

run

git clone https://github.com/minio/c2goasm.git
cd c2goasm/test/cpp
./assemble.sh ./MaddConstant.cpp
cd ../../
go build
./c2goasm -a ./test/cpp/MaddConstant.s ./test/MaddConstant_amd64.s

error

Processing ./test/cpp/MaddConstant.s
panic: Failed to find function prototype for _Z12MaddConstantPfS_S_

goroutine 1 [running]:
main.parseCompanionFile(0xc4200131c0, 0x1c, 0xc420013268, 0x16, 0x0, 0x0, 0x1, 0x40e6d9, 0x51eb80, 0xc42004d850)
        /home/zero/go-works/src/c2goasm/arguments.go:75 +0x24c
main.process(0xc420094600, 0x1e, 0x20, 0xc4200131c0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/zero/go-works/src/c2goasm/c2goasm.go:86 +0x205
main.main()
        /home/zero/go-works/src/c2goasm/c2goasm.go:264 +0x390

Try to repair

diff --git a/subroutine.go b/subroutine.go

index 00d98f7..c6b3ec4 100644
--- a/subroutine.go
+++ b/subroutine.go
@@ -266,7 +266,7 @@ func extractNamePart(part string) (int, string) {
 func extractName(name string) string {

        // Only proceed for C++ mangled names
-       if !(strings.HasPrefix(name, "_ZN") || strings.HasPrefix(name, "__Z")) {
+       if !(strings.HasPrefix(name, "_ZN") || strings.HasPrefix(name, "__Z") || strings.HasPrefix(name, "_Z")) {
                return name
        }

but run go test -v ./... has error

FAIL    c2goasm/cgocmp [build failed]
=== RUN   TestMaddArgs10
--- PASS: TestMaddArgs10 (0.00s)
=== RUN   TestMaddConstant
unexpected fault address 0x0
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x4e7ba3]

goroutine 6 [running]:
runtime.throw(0x52fa3b, 0x5)
        /usr/lib/go/src/runtime/panic.go:616 +0x81 fp=0xc420039e00 sp=0xc420039de0 pc=0x428a91
runtime.sigpanic()
        /usr/lib/go/src/runtime/signal_unix.go:395 +0x211 fp=0xc420039e50 sp=0xc420039e00 pc=0x43bc61
c2goasm/test._MaddConstant(0xc420039ea0, 0xc420039ec0, 0xc420039e70)
        /home/zero/go-works/src/c2goasm/test/MaddConstant_amd64.s:11 +0x13 fp=0xc420039e58 sp=0xc420039e50 pc=0x4e7ba3
c2goasm/test.MaddConstant(0x3f80000000000000, 0x4040000040000000, 0x40a0000040800000, 0x40e0000040c00000, 0x4000000000000000, 0x40c0000040800000, 0x4120000041000000, 0x4160000041400000, 0x0, 0x0, ...)
        /home/zero/go-works/src/c2goasm/test/MaddConstant_amd64.go:17 +0x5c fp=0xc420039ea0 sp=0xc420039e58 pc=0x4e5f3c
c2goasm/test.TestMaddConstant(0xc4200a21e0)
        /home/zero/go-works/src/c2goasm/test/MaddConstant_test.go:17 +0xd2 fp=0xc420039fa8 sp=0xc420039ea0 pc=0x4e65f2
testing.tRunner(0xc4200a21e0, 0x538520)
        /usr/lib/go/src/testing/testing.go:777 +0xd0 fp=0xc420039fd0 sp=0xc420039fa8 pc=0x4ad900
runtime.goexit()
        /usr/lib/go/src/runtime/asm_amd64.s:2361 +0x1 fp=0xc420039fd8 sp=0xc420039fd0 pc=0x454c51
created by testing.(*T).Run
        /usr/lib/go/src/testing/testing.go:824 +0x2e0

goroutine 1 [chan receive]:
testing.(*T).Run(0xc4200a21e0, 0x53176a, 0x10, 0x538520, 0x465d01)
        /usr/lib/go/src/testing/testing.go:825 +0x301
testing.runTests.func1(0xc4200a2000)
        /usr/lib/go/src/testing/testing.go:1063 +0x64
testing.tRunner(0xc4200a2000, 0xc42004ddf8)
        /usr/lib/go/src/testing/testing.go:777 +0xd0
testing.runTests(0xc42000a080, 0x5da340, 0x7, 0x7, 0x40e959)
        /usr/lib/go/src/testing/testing.go:1061 +0x2c4
testing.(*M).Run(0xc42009e000, 0x0)
        /usr/lib/go/src/testing/testing.go:978 +0x171
main.main()
        _testmain.go:56 +0x151
FAIL    c2goasm/test    0.003s

asm source

test/cpp/MaddConstant.s

    .file   "MaddConstant.cpp"
    .intel_syntax noprefix
    .text
    .p2align 4,,15
    .globl  _Z12MaddConstantPfS_S_
    .type   _Z12MaddConstantPfS_S_, @function
_Z12MaddConstantPfS_S_:
    vmovaps ymm0, YMMWORD PTR [rdi]
    vmovaps ymm1, YMMWORD PTR _ZL1a[rip]
    vfmadd132ps ymm0, ymm1, YMMWORD PTR [rsi]
    vmovups XMMWORD PTR [rdx], xmm0
    vextractf128    XMMWORD PTR 16[rdx], ymm0, 0x1
    vzeroupper
    ret
    .size   _Z12MaddConstantPfS_S_, .-_Z12MaddConstantPfS_S_
    .section    .rodata
    .align 32
    .type   _ZL1a, @object
    .size   _ZL1a, 32
_ZL1a:
    .long   1065353216
    .long   1073741824
    .long   1077936128
    .long   1082130432
    .long   1084227584
    .long   1086324736
    .long   1088421888
    .long   1090519040
    .ident  "GCC: (GNU) 8.1.0"
    .section    .note.GNU-stack,"",@progbits

test/MaddConstant_amd64.s

//+build !noasm !appengine
// AUTO-GENERATED BY C2GOASM -- DO NOT EDIT

TEXT ·_MaddConstant(SB), $0-24

    MOVQ vec1+0(FP), DI
    MOVQ vec2+8(FP), SI
    MOVQ result+16(FP), DX

    LONG $0x0728fcc5             // vmovaps    ymm0, YMMWORD PTR [rdi]
    QUAD $0x000000000d28fcc5     // vmovaps    ymm1, YMMWORD PTR _ZL1a[rip]
    LONG $0x9875e2c4; BYTE $0x06 // vfmadd132ps    ymm0, ymm1, YMMWORD PTR [rsi]
    LONG $0x0211f8c5             // vmovups    XMMWORD PTR [rdx], xmm0
    LONG $0x197de3c4; WORD $0x1042; BYTE $0x01 // vextractf128    XMMWORD PTR 16[rdx], ymm0, 0x1
    VZEROUPPER
    RET

source by my fork

fwessels commented 6 years ago

Can you try to compile with clang (as opposed to GCC)?

zeromake commented 6 years ago

@fwessels

use clang

diff --git a/test/cpp/assemble.sh b/test/cpp/assemble.sh
index 4bf4096..48d39c0 100755
--- a/test/cpp/assemble.sh
+++ b/test/cpp/assemble.sh
@@ -1 +1 @@
-c++ -O3 -mavx -mfma -masm=intel -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -S $1
+clang -O3 -mavx -mfma -masm=intel -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -S $1

MaddConstant test passed but other Test does not pass

/test/cpp/MaddArgs10.s

    .text
    .intel_syntax noprefix
    .file   "MaddArgs10.cpp"
    .globl  _Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_ # -- Begin function _Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_
    .p2align    4, 0x90
    .type   _Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_,@function
_Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_:     # @_Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_
# %bb.0:
    push    rbx
    mov r10, qword ptr [rsp + 40]
    mov r11, qword ptr [rsp + 32]
    mov rax, qword ptr [rsp + 16]
    mov rbx, qword ptr [rsp + 24]
    vmovaps ymm0, ymmword ptr [rdi]
    vmovaps ymm1, ymmword ptr [rsi]
    vmovaps ymm2, ymmword ptr [rcx]
    vmovaps ymm3, ymmword ptr [r9]
    vmovaps ymm4, ymmword ptr [rbx]
    vfmadd213ps ymm1, ymm0, ymmword ptr [rdx]
    vfmadd213ps ymm1, ymm2, ymmword ptr [r8]
    vfmadd213ps ymm1, ymm3, ymmword ptr [rax]
    vfmadd213ps ymm1, ymm4, ymmword ptr [r11]
    vmovups ymmword ptr [r10], ymm1
    pop rbx
    vzeroupper
    ret
.Lfunc_end0:
    .size   _Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_, .Lfunc_end0-_Z10MaddArgs10PfS_S_S_S_S_S_S_S_S_
                                        # -- End function

    .ident  "clang version 6.0.0 (tags/RELEASE_600/final)"
    .section    ".note.GNU-stack","",@progbits

test/MaddArgs10_amd64.s

//+build !noasm !appengine
// AUTO-GENERATED BY C2GOASM -- DO NOT EDIT

TEXT ·_MaddArgs10(SB), $40-80

    MOVQ vec1+0(FP), DI
    MOVQ vec2+8(FP), SI
    MOVQ vec3+16(FP), DX
    MOVQ vec4+24(FP), CX
    MOVQ vec5+32(FP), R8
    MOVQ vec6+40(FP), R9
    MOVQ vec7+48(FP), R10
    MOVQ vec8+56(FP), R11
    MOVQ vec9+64(FP), R12
    MOVQ result+72(FP), R13
    ADDQ $8, SP
    MOVQ R13, 24(SP)
    MOVQ R12, 16(SP)
    MOVQ R11, 8(SP)
    MOVQ R10, 0(SP)

    LONG $0x24548b4c; BYTE $0x28 // mov    r10, qword [rsp + 40]
    LONG $0x245c8b4c; BYTE $0x20 // mov    r11, qword [rsp + 32]
    LONG $0x24448b48; BYTE $0x10 // mov    rax, qword [rsp + 16]
    LONG $0x245c8b48; BYTE $0x18 // mov    rbx, qword [rsp + 24]
    LONG $0x0728fcc5             // vmovaps    ymm0, yword [rdi]
    LONG $0x0e28fcc5             // vmovaps    ymm1, yword [rsi]
    LONG $0x1128fcc5             // vmovaps    ymm2, yword [rcx]
    LONG $0x287cc1c4; BYTE $0x19 // vmovaps    ymm3, yword [r9]
    LONG $0x2328fcc5             // vmovaps    ymm4, yword [rbx]
    LONG $0xa87de2c4; BYTE $0x0a // vfmadd213ps    ymm1, ymm0, yword [rdx]
    LONG $0xa86dc2c4; BYTE $0x08 // vfmadd213ps    ymm1, ymm2, yword [r8]
    LONG $0xa865e2c4; BYTE $0x08 // vfmadd213ps    ymm1, ymm3, yword [rax]
    LONG $0xa85dc2c4; BYTE $0x0b // vfmadd213ps    ymm1, ymm4, yword [r11]
    LONG $0x117cc1c4; BYTE $0x0a // vmovups    yword [r10], ymm1
    SUBQ $8, SP
    VZEROUPPER
    RET

test error

=== RUN   TestMaddArgs10
runtime: unexpected return pc for c2goasm/test._MaddArgs10 called from 0xc420039ce0
stack: frame={sp:0xc420052c30, fp:0xc420052c68} stack=[0xc420052000,0xc420053000)
000000c420052b30:  0000000000000000  0000000000000000
000000c420052b40:  0000000000000000  0000000000000000
000000c420052b50:  000000000042947c <runtime.gwrite+76>  0000000000533921
000000c420052b60:  0000000000000019  0000000000000019
000000c420052b70:  0000000000000000  0000000000000000
000000c420052b80:  000000c420052bd0  0000000000429cfd <runtime.printstring+125>
000000c420052b90:  0000000000533921  0000000000000019
000000c420052ba0:  0000000000000019  0000000000533921
000000c420052bb0:  0000000000000019  0000000000533921
000000c420052bc0:  0000000000000019  0000000000000019
000000c420052bd0:  000000c420052c20  000000000043bc30 <runtime.sigpanic+480>
000000c420052be0:  0000000000533921  0000000000000019
000000c420052bf0:  000000000000000f  000000c420039c20
000000c420052c00:  0000000000000000  000000c420001080
000000c420052c10:  00000000005adb60  000000000000000f
000000c420052c20:  000000c420052c50  00000000004e7b5f <c2goasm/test._MaddArgs10+127>
000000c420052c30: <000000c420039da0  000000c420039dc0
000000c420052c40:  000000c420039de0  000000c420039cb0
000000c420052c50:  000000c420039cd0  00000000004e5ea1 <c2goasm/test.MaddArgs10+193>
000000c420052c60: !000000c420039ce0 >000000c420039d00
000000c420052c70:  000000c420039d20  000000c420039d40
000000c420052c80:  000000c420039d60  000000c420039d80
000000c420052c90:  000000c420039da0  000000c420039dc0
000000c420052ca0:  000000c420039de0  000000c420039cb0
000000c420052cb0:  0000000000000000  0000000000000000
000000c420052cc0:  0000000000000000  0000000000000000
000000c420052cd0:  000000c420039f98  00000000004e6343 <c2goasm/test.TestMaddArgs10+627>
000000c420052ce0:  3f80000000000000  4040000040000000
000000c420052cf0:  40a0000040800000  40e0000040c00000
000000c420052d00:  4000000000000000  40c0000040800000
000000c420052d10:  4120000041000000  4160000041400000
000000c420052d20:  4000000000000000  40c0000040800000
000000c420052d30:  4120000041000000  4160000041400000
000000c420052d40:  4000000000000000  40c0000040800000
000000c420052d50:  4120000041000000  4160000041400000
000000c420052d60:  4000000000000000
fatal error: unknown caller pc

runtime stack:
runtime.throw(0x531d00, 0x11)
        /usr/lib/go/src/runtime/panic.go:616 +0x81
runtime.gentraceback(0xffffffffffffffff, 0xffffffffffffffff, 0x0, 0xc420001080, 0x0, 0x0, 0x7fffffff, 0x538710, 0x7ffe2fb8ccf8, 0x0, ...)
        /usr/lib/go/src/runtime/traceback.go:257 +0x1bdb
runtime.copystack(0xc420001080, 0x1000, 0x1)
        /usr/lib/go/src/runtime/stack.go:891 +0x270
runtime.newstack()
        /usr/lib/go/src/runtime/stack.go:1063 +0x30f
runtime.morestack()
        /usr/lib/go/src/runtime/asm_amd64.s:480 +0x89

goroutine 5 [copystack]:
runtime.recordForPanic(0x533921, 0x19, 0x19)
        /usr/lib/go/src/runtime/print.go:40 +0x115 fp=0xc420052b58 sp=0xc420052b50 pc=0x429335
runtime.gwrite(0x533921, 0x19, 0x19)
        /usr/lib/go/src/runtime/print.go:90 +0x4c fp=0xc420052b90 sp=0xc420052b58 pc=0x42947c
runtime.printstring(0x533921, 0x19)
        /usr/lib/go/src/runtime/print.go:237 +0x7d fp=0xc420052be0 sp=0xc420052b90 pc=0x429cfd
runtime.sigpanic()
        /usr/lib/go/src/runtime/signal_unix.go:394 +0x1e0 fp=0xc420052c30 sp=0xc420052be0 pc=0x43bc30
runtime: unexpected return pc for c2goasm/test._MaddArgs10 called from 0xc420039ce0
stack: frame={sp:0xc420052c30, fp:0xc420052c68} stack=[0xc420052000,0xc420053000)
000000c420052b30:  0000000000000000  0000000000000000
000000c420052b40:  0000000000000000  0000000000000000
000000c420052b50:  000000000042947c <runtime.gwrite+76>  0000000000533921
000000c420052b60:  0000000000000019  0000000000000019
000000c420052b70:  0000000000000000  0000000000000000
000000c420052b80:  000000c420052bd0  0000000000429cfd <runtime.printstring+125>
000000c420052b90:  0000000000533921  0000000000000019
000000c420052ba0:  0000000000000019  0000000000533921
000000c420052bb0:  0000000000000019  0000000000533921
000000c420052bc0:  0000000000000019  0000000000000019
000000c420052bd0:  000000c420052c20  000000000043bc30 <runtime.sigpanic+480>
000000c420052be0:  0000000000533921  0000000000000019
000000c420052bf0:  000000000000000f  000000c420039c20
000000c420052c00:  0000000000000000  000000c420001080
000000c420052c10:  00000000005adb60  000000000000000f
000000c420052c20:  000000c420052c50  00000000004e7b5f <c2goasm/test._MaddArgs10+127>
000000c420052c30: <000000c420039da0  000000c420039dc0
000000c420052c40:  000000c420039de0  000000c420039cb0
000000c420052c50:  000000c420039cd0  00000000004e5ea1 <c2goasm/test.MaddArgs10+193>
000000c420052c60: !000000c420039ce0 >000000c420039d00
000000c420052c70:  000000c420039d20  000000c420039d40
000000c420052c80:  000000c420039d60  000000c420039d80
000000c420052c90:  000000c420039da0  000000c420039dc0
000000c420052ca0:  000000c420039de0  000000c420039cb0
000000c420052cb0:  0000000000000000  0000000000000000
000000c420052cc0:  0000000000000000  0000000000000000
000000c420052cd0:  000000c420039f98  00000000004e6343 <c2goasm/test.TestMaddArgs10+627>
000000c420052ce0:  3f80000000000000  4040000040000000
000000c420052cf0:  40a0000040800000  40e0000040c00000
000000c420052d00:  4000000000000000  40c0000040800000
000000c420052d10:  4120000041000000  4160000041400000
000000c420052d20:  4000000000000000  40c0000040800000
000000c420052d30:  4120000041000000  4160000041400000
000000c420052d40:  4000000000000000  40c0000040800000
000000c420052d50:  4120000041000000  4160000041400000
000000c420052d60:  4000000000000000
c2goasm/test._MaddArgs10(0xc420039d00, 0xc420039d20, 0xc420039d40, 0xc420039d60, 0xc420039d80, 0xc420039da0, 0xc420039dc0, 0xc420039de0, 0xc420039cb0, 0x0)
        /home/zero/go-works/src/c2goasm/test/MaddArgs10_amd64.s:30 +0x7f fp=0xc420052c68 sp=0xc420052c30 pc=0x4e7b5f
created by testing.(*T).Run
        /usr/lib/go/src/testing/testing.go:824 +0x2e0

goroutine 1 [chan receive]:
testing.(*T).Run(0xc4200a20f0, 0x5311d9, 0xe, 0x538518, 0x465d36)
        /usr/lib/go/src/testing/testing.go:825 +0x301
testing.runTests.func1(0xc4200a2000)
        /usr/lib/go/src/testing/testing.go:1063 +0x64
testing.tRunner(0xc4200a2000, 0xc42004ddf8)
        /usr/lib/go/src/testing/testing.go:777 +0xd0
testing.runTests(0xc42000a080, 0x5da340, 0x7, 0x7, 0x40e959)
        /usr/lib/go/src/testing/testing.go:1061 +0x2c4
testing.(*M).Run(0xc42009e000, 0x0)
        /usr/lib/go/src/testing/testing.go:978 +0x171
main.main()
        _testmain.go:56 +0x151
FAIL    c2goasm/test    0.004s
zeromake commented 6 years ago

@fwessels So what about has?