mirror of https://github.com/tinygo-org/tinygo.git
Browse Source
This has the benefit of not requiring a 'runtime' IR file, so that complete relocatable files can be built without requiring input IR. This makes the compiler a lot easier to use without the Makefile. Code size is not affected.pull/6/head
Ayke van Laethem
6 years ago
7 changed files with 70 additions and 49 deletions
@ -1,27 +1,3 @@ |
|||||
source_filename = "runtime/runtime.ll" |
source_filename = "runtime/runtime.ll" |
||||
|
|
||||
declare void @runtime.initAll() |
; dummy file |
||||
declare void @main.main() |
|
||||
declare i8* @main.main$async(i8*) |
|
||||
declare void @runtime.scheduler(i8*) |
|
||||
|
|
||||
; Will be changed to true if there are 'go' statements in the compiled program. |
|
||||
@has_scheduler = private unnamed_addr constant i1 false |
|
||||
|
|
||||
define i32 @main() { |
|
||||
call void @runtime.initAll() |
|
||||
%has_scheduler = load i1, i1* @has_scheduler |
|
||||
; This branch will be optimized away. Only one of the targets will remain. |
|
||||
br i1 %has_scheduler, label %with_scheduler, label %without_scheduler |
|
||||
|
|
||||
with_scheduler: |
|
||||
; Initialize main and run the scheduler. |
|
||||
%main = call i8* @main.main$async(i8* null) |
|
||||
call void @runtime.scheduler(i8* %main) |
|
||||
ret i32 0 |
|
||||
|
|
||||
without_scheduler: |
|
||||
; No scheduler is necessary. Call main directly. |
|
||||
call void @main.main() |
|
||||
ret i32 0 |
|
||||
} |
|
||||
|
Loading…
Reference in new issue