c2goasm icon indicating copy to clipboard operation
c2goasm copied to clipboard

linux gcc8 fun name error

Open zeromake opened this issue 6 years ago • 3 comments

env

  • system: linux amd64(archlinux)
  • gcc: v8.1.0
  • clang & llvm: v6.0.0
  • yasm: v1.3.0
  • c2goasm: last master
  • asm2plan9s: last master

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

zeromake avatar Jun 06 '18 08:06 zeromake

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

fwessels avatar Jun 06 '18 19:06 fwessels

@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 avatar Jun 07 '18 01:06 zeromake

@fwessels So what about has?

zeromake avatar Jun 15 '18 08:06 zeromake