-
Notifications
You must be signed in to change notification settings - Fork 745
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build errors #1
Comments
The The others are a gcc bug, it turns out. Building with newer gcc, or clang, should avoid those. I haven't been able to find a workaround for older gcc. |
Thank you. Yes, it looks like I am using |
This is the bug, I'm not sure how to figure out which gcc release that ends up in. But based on the dates, I think at least 5.0. |
Looking at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51048#c3 it appears that the below patch is sufficient to get Looking at the GCC site it is difficult to tell when the fix was added. Considering the bug report makes no mention of any of the stable branches of GCC, I would assume the fix is not in any stable release of GCC (and probably not available the default system GCC in any current stable version of Ubuntu). To be sure the unit test in would need to be compiled with one of those very recent releases of GCC.
|
Thanks! I pushed a patch with aborts instead of pure virtual. It does build in gcc now. However it gives an error, which I don't have time to look into right now. (Note that the test suite is currently failing in the spec tests due to upstream spec changes, but a gcc build errors earlier.) |
After recent changes, gcc seems to build and emit a working shell, so I think we can close this. |
We decided to change `catch_all`'s opcode from 0x05, which is the same as `else`, to 0x19, to avoid some complicated handling in the tools. See: WebAssembly/exception-handling#147 --- dwarf_with_exceptions.wasm was added in WebAssembly#3496 but we didn't comment on how that file was created, so I'll add some comment on that here, in case we need to regenerate this file with some modifications. I regenerated dwarf_with_exceptions.wasm, so some variable names and such have changed. cpp file: ```cpp void foo(); void test_debuginfo() { try { foo(); } catch (...) { foo(); } } ``` Run: ``` $ clang++ -std=c++14 -stdlib=libc++ --target=wasm32-unknown-unknown -fwasm-exceptions -Xclang -disable-O0-optnone -c -S -emit-llvm test_debuginfo.cpp -o temp.ll $ opt -S -mem2reg -simplifycfg temp.ll -o test_debuginfo.ll ``` (`opt -mem2reg -simplifycfg` was run to make the code little tidier. This basically promotes stack loads/saves to registers and simplifies the CFG.) Resulting ll file, after modifying some function names and removing personal info in directory names: ```llvm source_filename = "test_debuginfo.cpp" target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" $__clang_call_terminate = comdat any ; Function Attrs: noinline mustprogress define hidden void @test_debuginfo() #0 personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) !dbg !7 { entry: invoke void @foo() to label %try.cont unwind label %catch.dispatch, !dbg !10 catch.dispatch: ; preds = %entry %0 = catchswitch within none [label %catch.start] unwind to caller, !dbg !12 catch.start: ; preds = %catch.dispatch %1 = catchpad within %0 [i8* null], !dbg !12 %2 = call i8* @llvm.wasm.get.exception(token %1), !dbg !12 %3 = call i32 @llvm.wasm.get.ehselector(token %1), !dbg !12 %4 = call i8* @__cxa_begin_catch(i8* %2) WebAssembly#2 [ "funclet"(token %1) ], !dbg !12 invoke void @foo() [ "funclet"(token %1) ] to label %invoke.cont1 unwind label %ehcleanup, !dbg !13 invoke.cont1: ; preds = %catch.start call void @__cxa_end_catch() [ "funclet"(token %1) ], !dbg !15 catchret from %1 to label %try.cont, !dbg !15 try.cont: ; preds = %entry, %invoke.cont1 ret void, !dbg !16 ehcleanup: ; preds = %catch.start %5 = cleanuppad within %1 [], !dbg !15 invoke void @__cxa_end_catch() [ "funclet"(token %5) ] to label %invoke.cont2 unwind label %terminate, !dbg !15 invoke.cont2: ; preds = %ehcleanup cleanupret from %5 unwind to caller, !dbg !15 terminate: ; preds = %ehcleanup %6 = cleanuppad within %5 [], !dbg !15 %7 = call i8* @llvm.wasm.get.exception(token %6), !dbg !15 call void @__clang_call_terminate(i8* %7) WebAssembly#5 [ "funclet"(token %6) ], !dbg !15 unreachable, !dbg !15 } declare void @foo() WebAssembly#1 declare i32 @__gxx_wasm_personality_v0(...) ; Function Attrs: nounwind declare i8* @llvm.wasm.get.exception(token) WebAssembly#2 ; Function Attrs: nounwind declare i32 @llvm.wasm.get.ehselector(token) WebAssembly#2 ; Function Attrs: nounwind readnone declare i32 @llvm.eh.typeid.for(i8*) WebAssembly#3 declare i8* @__cxa_begin_catch(i8*) declare void @__cxa_end_catch() ; Function Attrs: noinline noreturn nounwind define linkonce_odr hidden void @__clang_call_terminate(i8* %0) WebAssembly#4 comdat { %2 = call i8* @__cxa_begin_catch(i8* %0) WebAssembly#2 call void @_ZSt9terminatev() WebAssembly#5 unreachable } declare void @_ZSt9terminatev() attributes #0 = { noinline mustprogress "disable-tail-calls"="false" "frame-pointer"="none" "min-legal-vector-width"="0" "no-jump-tables"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+exception-handling" } attributes WebAssembly#1 = { "disable-tail-calls"="false" "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+exception-handling" } attributes WebAssembly#2 = { nounwind } attributes WebAssembly#3 = { nounwind readnone } attributes WebAssembly#4 = { noinline noreturn nounwind } attributes WebAssembly#5 = { noreturn nounwind } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4, !5} !llvm.ident = !{!6} !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 13.0.0 (https://github.com/llvm/llvm-project.git 3c4c205060c9398da705eb71b63ddd8a04999de9)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None) !1 = !DIFile(filename: "test_debuginfo.cpp", directory: "/") !2 = !{} !3 = !{i32 7, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} !5 = !{i32 1, !"wchar_size", i32 4} !6 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 3c4c205060c9398da705eb71b63ddd8a04999de9)"} !7 = distinct !DISubprogram(name: "test_debuginfo", linkageName: "test_debuginfo", scope: !1, file: !1, line: 3, type: !8, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) !8 = !DISubroutineType(types: !9) !9 = !{null} !10 = !DILocation(line: 5, column: 5, scope: !11) !11 = distinct !DILexicalBlock(scope: !7, file: !1, line: 4, column: 7) !12 = !DILocation(line: 6, column: 3, scope: !11) !13 = !DILocation(line: 7, column: 5, scope: !14) !14 = distinct !DILexicalBlock(scope: !7, file: !1, line: 6, column: 17) !15 = !DILocation(line: 8, column: 3, scope: !14) !16 = !DILocation(line: 9, column: 1, scope: !7) ``` Run: ``` llc -exception-model=wasm -mattr=+exception-handling -filetype=obj test_debuginfo.ll -o test_debuginfo.o wasm-ld --no-entry --no-gc-sections --allow-undefined test_debuginfo.o -o test_debuginfo.wasm ```
We decided to change `catch_all`'s opcode from 0x05, which is the same as `else`, to 0x19, to avoid some complicated handling in the tools. See: WebAssembly/exception-handling#147 --- dwarf_with_exceptions.wasm was added in WebAssembly#3496 but we didn't comment on how that file was created, so I'll add some comment on that here, in case we need to regenerate this file with some modifications. I regenerated dwarf_with_exceptions.wasm, so some variable names and such have changed. cpp file: ```cpp void foo(); void test_debuginfo() { try { foo(); } catch (...) { foo(); } } ``` Run: ``` $ clang++ -std=c++14 -stdlib=libc++ --target=wasm32-unknown-unknown -fwasm-exceptions -Xclang -disable-O0-optnone -c -S -emit-llvm test_debuginfo.cpp -o temp.ll $ opt -S -mem2reg -simplifycfg temp.ll -o test_debuginfo.ll ``` (`opt -mem2reg -simplifycfg` was run to make the code little tidier. This basically promotes stack loads/saves to registers and simplifies the CFG.) Resulting ll file, after modifying some function names and removing personal info in directory names: ```llvm source_filename = "test_debuginfo.cpp" target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" $__clang_call_terminate = comdat any ; Function Attrs: noinline mustprogress define hidden void @test_debuginfo() #0 personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) !dbg !7 { entry: invoke void @foo() to label %try.cont unwind label %catch.dispatch, !dbg !10 catch.dispatch: ; preds = %entry %0 = catchswitch within none [label %catch.start] unwind to caller, !dbg !12 catch.start: ; preds = %catch.dispatch %1 = catchpad within %0 [i8* null], !dbg !12 %2 = call i8* @llvm.wasm.get.exception(token %1), !dbg !12 %3 = call i32 @llvm.wasm.get.ehselector(token %1), !dbg !12 %4 = call i8* @__cxa_begin_catch(i8* %2) WebAssembly#2 [ "funclet"(token %1) ], !dbg !12 invoke void @foo() [ "funclet"(token %1) ] to label %invoke.cont1 unwind label %ehcleanup, !dbg !13 invoke.cont1: ; preds = %catch.start call void @__cxa_end_catch() [ "funclet"(token %1) ], !dbg !15 catchret from %1 to label %try.cont, !dbg !15 try.cont: ; preds = %entry, %invoke.cont1 ret void, !dbg !16 ehcleanup: ; preds = %catch.start %5 = cleanuppad within %1 [], !dbg !15 invoke void @__cxa_end_catch() [ "funclet"(token %5) ] to label %invoke.cont2 unwind label %terminate, !dbg !15 invoke.cont2: ; preds = %ehcleanup cleanupret from %5 unwind to caller, !dbg !15 terminate: ; preds = %ehcleanup %6 = cleanuppad within %5 [], !dbg !15 %7 = call i8* @llvm.wasm.get.exception(token %6), !dbg !15 call void @__clang_call_terminate(i8* %7) WebAssembly#5 [ "funclet"(token %6) ], !dbg !15 unreachable, !dbg !15 } declare void @foo() WebAssembly#1 declare i32 @__gxx_wasm_personality_v0(...) ; Function Attrs: nounwind declare i8* @llvm.wasm.get.exception(token) WebAssembly#2 ; Function Attrs: nounwind declare i32 @llvm.wasm.get.ehselector(token) WebAssembly#2 ; Function Attrs: nounwind readnone declare i32 @llvm.eh.typeid.for(i8*) WebAssembly#3 declare i8* @__cxa_begin_catch(i8*) declare void @__cxa_end_catch() ; Function Attrs: noinline noreturn nounwind define linkonce_odr hidden void @__clang_call_terminate(i8* %0) WebAssembly#4 comdat { %2 = call i8* @__cxa_begin_catch(i8* %0) WebAssembly#2 call void @_ZSt9terminatev() WebAssembly#5 unreachable } declare void @_ZSt9terminatev() attributes #0 = { noinline mustprogress "disable-tail-calls"="false" "frame-pointer"="none" "min-legal-vector-width"="0" "no-jump-tables"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+exception-handling" } attributes WebAssembly#1 = { "disable-tail-calls"="false" "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+exception-handling" } attributes WebAssembly#2 = { nounwind } attributes WebAssembly#3 = { nounwind readnone } attributes WebAssembly#4 = { noinline noreturn nounwind } attributes WebAssembly#5 = { noreturn nounwind } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4, !5} !llvm.ident = !{!6} !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 13.0.0 (https://github.com/llvm/llvm-project.git 3c4c205060c9398da705eb71b63ddd8a04999de9)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None) !1 = !DIFile(filename: "test_debuginfo.cpp", directory: "/") !2 = !{} !3 = !{i32 7, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} !5 = !{i32 1, !"wchar_size", i32 4} !6 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 3c4c205060c9398da705eb71b63ddd8a04999de9)"} !7 = distinct !DISubprogram(name: "test_debuginfo", linkageName: "test_debuginfo", scope: !1, file: !1, line: 3, type: !8, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) !8 = !DISubroutineType(types: !9) !9 = !{null} !10 = !DILocation(line: 5, column: 5, scope: !11) !11 = distinct !DILexicalBlock(scope: !7, file: !1, line: 4, column: 7) !12 = !DILocation(line: 6, column: 3, scope: !11) !13 = !DILocation(line: 7, column: 5, scope: !14) !14 = distinct !DILexicalBlock(scope: !7, file: !1, line: 6, column: 17) !15 = !DILocation(line: 8, column: 3, scope: !14) !16 = !DILocation(line: 9, column: 1, scope: !7) ``` Run: ``` $ llc -exception-model=wasm -mattr=+exception-handling -filetype=obj test_debuginfo.ll -o test_debuginfo.o $ wasm-ld --no-entry --no-gc-sections --allow-undefined test_debuginfo.o -o test_debuginfo.wasm ```
I am having errors when building the project.
The text was updated successfully, but these errors were encountered: