Skip to content
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

We need a proper build system #2

Closed
kripken opened this issue Nov 13, 2015 · 8 comments
Closed

We need a proper build system #2

kripken opened this issue Nov 13, 2015 · 8 comments

Comments

@kripken
Copy link
Member

kripken commented Nov 13, 2015

CMake?

@waywardmonkeys
Copy link
Contributor

I've got a start on this in cmake ... I'll submit a pull request shortly. It isn't complete, but it is a start.

@svenstaro
Copy link
Contributor

CMake is fine. @waywardmonkeys your changes don't seem to be public yet. Can you push them? I would like to take a look as I'm also interested in working on this.

waywardmonkeys added a commit to waywardmonkeys/binaryen that referenced this issue Dec 19, 2015
This is not yet complete as it doesn't perform the emscripten
build stage, nor does it attempt to run tests.

This is work in progress on issue WebAssembly#2.
@kripken
Copy link
Member Author

kripken commented Dec 19, 2015

After @WaywardMonkey's first pull and some tweaks, cmake mostly works. The main missing piece is it doesn't invoke emcc to build wasm.js yet.

@sletz sletz mentioned this issue Jan 4, 2016
@mbebenita
Copy link
Contributor

build.sh is not in sync with CMake and fails in several ways. Even after making sure that I compile the same source files as CMake, check.py fails because the support library is not built.

Question is, should we fix build.sh or just drop it all together?

@kripken
Copy link
Member Author

kripken commented Jan 6, 2016

Yeah, it's getting worse. I just pushed a commit to move build.sh to use cmake for everything that it can, which is everything but wasm.js. Hopefully we can figure out the wasm.js bit (tricky part is calling emcc, and not the system compiler), and remove build.sh entirely.

@kripken
Copy link
Member Author

kripken commented Jun 28, 2016

This is mostly done, but we still have build-js.sh for building the JS parts. Would be nice if that could be done in cmake as well, but it means invoking out to call a different compiler (emcc) so maybe not. If not, we can close this.

@dschuff
Copy link
Member

dschuff commented Jul 7, 2016

If build-js.sh stays as simple as it is, then unlikely to be worth the effort of trying to have multiple toolchains in a single build system configuration. This is especially true since we don't really need to have support for random users running it on a variety of OSes. I'd say we can call this issue fixed since we have CMake and of course update it as needed.

@dschuff dschuff closed this as completed Jul 7, 2016
@binji
Copy link
Member

binji commented Jul 7, 2016

With sexpr-wasm, I have a neat trick where I have a top-level Makefile drive the CMake build underneath. That way you can have different toolchain configurations easily accessible. Currently I support a full matrix of {gcc, gcc-i686, clang, emscripten, gcc w/ AFL fuzz} * {debug, release} * {msan, lsan, asan, ubsan}.

aheejin added a commit to aheejin/binaryen that referenced this issue Feb 17, 2021
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
```
aheejin added a commit to aheejin/binaryen that referenced this issue Feb 17, 2021
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
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants