Iter 5c: Cross-Module-Codegen
Symbol-Mangling-Schema einheitlich auf @ail_<modul>_<def> umgestellt (auch für Single-Modul-Programme), String-Globals als @.str_<modul>_<idx>. main bleibt LLVM-/C-ABI-Eintrittspunkt und ist ein Trampoline auf @ail_<entry>_main. lower_workspace emittiert eine einzige .ll für den ganzen Workspace, alphabetisch nach Modulname, Cross-Module-Calls über Import-Map aufgelöst. ail build / ail emit-ir laufen jetzt durch den Workspace-Pfad. IR-Snapshots regeneriert, neuer ws_main-Snapshot. E2E-Test workspace_build_runs_imported_fn prüft, dass das Binary die importierte Funktion korrekt aufruft. Schuld #19 (source_filename) durch einheitliches <entry>.ail-Schema geschlossen.
This commit is contained in:
@@ -256,6 +256,15 @@ fn check_workspace_resolves_import() {
|
||||
assert_eq!(stdout.trim(), "[]", "expected empty diagnostic array");
|
||||
}
|
||||
|
||||
/// Schützt Iter 5c (Cross-Module-Codegen): `ail build` über
|
||||
/// `examples/ws_main.ail.json` muss das Workspace inkl. `ws_lib` lowern,
|
||||
/// `@ail_ws_main_main` muss `@ail_ws_lib_add(2,3)` aufrufen und `5` drucken.
|
||||
#[test]
|
||||
fn workspace_build_runs_imported_fn() {
|
||||
let stdout = build_and_run("ws_main.ail.json");
|
||||
assert_eq!(stdout.trim(), "5", "ws_lib.add(2,3) should print 5");
|
||||
}
|
||||
|
||||
/// Schützt das `--json`-Diagnostic-Format für Tooling-Konsumenten.
|
||||
/// `broken_unbound.ail.json` referenziert eine nicht-existente Variable;
|
||||
/// erwartet wird Exit-Code 1 und mindestens ein Diagnostic mit
|
||||
|
||||
@@ -151,3 +151,12 @@ fn ir_snapshot_hello() {
|
||||
fn ir_snapshot_list() {
|
||||
check_ir_snapshot("list.ail.json", "list.ll");
|
||||
}
|
||||
|
||||
/// Schützt das Workspace-Lowering (Iter 5c): das Eintrittsmodul `ws_main`
|
||||
/// importiert `ws_lib`, beide werden in derselben `.ll` emittiert,
|
||||
/// `@ail_ws_main_main` ruft `@ail_ws_lib_add` auf, und das Trampoline
|
||||
/// `@main` ruft `@ail_ws_main_main`.
|
||||
#[test]
|
||||
fn ir_snapshot_ws_main() {
|
||||
check_ir_snapshot("ws_main.ail.json", "ws_main.ll");
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
; AILang generated module: hello
|
||||
; AILang generated workspace; entry: hello
|
||||
source_filename = "hello.ail"
|
||||
target triple = "<NORMALIZED>"
|
||||
|
||||
@.str_str_0 = private unnamed_addr constant [15 x i8] c"Hallo, AILang.\00", align 1
|
||||
@.str_hello_str_0 = private unnamed_addr constant [15 x i8] c"Hallo, AILang.\00", align 1
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
declare i32 @puts(ptr)
|
||||
declare ptr @malloc(i64)
|
||||
|
||||
define i8 @ail_main() {
|
||||
define i8 @ail_hello_main() {
|
||||
entry:
|
||||
call i32 @puts(ptr @.str_str_0)
|
||||
call i32 @puts(ptr @.str_hello_str_0)
|
||||
ret i8 0
|
||||
}
|
||||
|
||||
|
||||
define i32 @main() {
|
||||
call i8 @ail_main()
|
||||
call i8 @ail_hello_main()
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
; AILang generated module: list
|
||||
; AILang generated workspace; entry: list
|
||||
source_filename = "list.ail"
|
||||
target triple = "<NORMALIZED>"
|
||||
|
||||
@.str_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
@.str_list_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
declare i32 @puts(ptr)
|
||||
declare ptr @malloc(i64)
|
||||
|
||||
define i64 @ail_sum_list(ptr %arg_xs) {
|
||||
define i64 @ail_list_sum_list(ptr %arg_xs) {
|
||||
entry:
|
||||
%v1 = load i64, ptr %arg_xs, align 8
|
||||
switch i64 %v1, label %mdefault.2 [
|
||||
@@ -22,7 +22,7 @@ marm.2.1:
|
||||
%v4 = load i64, ptr %v3, align 8
|
||||
%v5 = getelementptr inbounds i8, ptr %arg_xs, i64 16
|
||||
%v6 = load ptr, ptr %v5, align 8
|
||||
%v7 = call i64 @ail_sum_list(ptr %v6)
|
||||
%v7 = call i64 @ail_list_sum_list(ptr %v6)
|
||||
%v8 = add i64 %v4, %v7
|
||||
br label %mjoin.2
|
||||
mdefault.2:
|
||||
@@ -32,7 +32,7 @@ mjoin.2:
|
||||
ret i64 %v9
|
||||
}
|
||||
|
||||
define i8 @ail_main() {
|
||||
define i8 @ail_list_main() {
|
||||
entry:
|
||||
%v1 = call ptr @malloc(i64 8)
|
||||
store i64 0, ptr %v1, align 8
|
||||
@@ -54,13 +54,13 @@ entry:
|
||||
store i64 10, ptr %v9, align 8
|
||||
%v10 = getelementptr inbounds i8, ptr %v8, i64 16
|
||||
store ptr %v5, ptr %v10, align 8
|
||||
%v11 = call i64 @ail_sum_list(ptr %v8)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_fmt_int_0, i64 %v11)
|
||||
%v11 = call i64 @ail_list_sum_list(ptr %v8)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_list_fmt_int_0, i64 %v11)
|
||||
ret i8 0
|
||||
}
|
||||
|
||||
|
||||
define i32 @main() {
|
||||
call i8 @ail_main()
|
||||
call i8 @ail_list_main()
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
; AILang generated module: max3
|
||||
; AILang generated workspace; entry: max3
|
||||
source_filename = "max3.ail"
|
||||
target triple = "<NORMALIZED>"
|
||||
|
||||
@.str_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
@.str_max3_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
declare i32 @puts(ptr)
|
||||
declare ptr @malloc(i64)
|
||||
|
||||
define i64 @ail_max(i64 %arg_a, i64 %arg_b) {
|
||||
define i64 @ail_max3_max(i64 %arg_a, i64 %arg_b) {
|
||||
entry:
|
||||
%v1 = icmp sgt i64 %arg_a, %arg_b
|
||||
br i1 %v1, label %then.2, label %else.2
|
||||
@@ -21,7 +21,7 @@ join.2:
|
||||
ret i64 %v3
|
||||
}
|
||||
|
||||
define i64 @ail_max3(i64 %arg_a, i64 %arg_b, i64 %arg_c) {
|
||||
define i64 @ail_max3_max3(i64 %arg_a, i64 %arg_b, i64 %arg_c) {
|
||||
entry:
|
||||
%v1 = icmp sgt i64 %arg_a, %arg_b
|
||||
br i1 %v1, label %then.2, label %else.2
|
||||
@@ -50,15 +50,15 @@ join.2:
|
||||
ret i64 %v9
|
||||
}
|
||||
|
||||
define i8 @ail_main() {
|
||||
define i8 @ail_max3_main() {
|
||||
entry:
|
||||
%v1 = call i64 @ail_max3(i64 3, i64 17, i64 9)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_fmt_int_0, i64 %v1)
|
||||
%v1 = call i64 @ail_max3_max3(i64 3, i64 17, i64 9)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_max3_fmt_int_0, i64 %v1)
|
||||
ret i8 0
|
||||
}
|
||||
|
||||
|
||||
define i32 @main() {
|
||||
call i8 @ail_main()
|
||||
call i8 @ail_max3_main()
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
; AILang generated module: sum
|
||||
; AILang generated workspace; entry: sum
|
||||
source_filename = "sum.ail"
|
||||
target triple = "<NORMALIZED>"
|
||||
|
||||
@.str_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
@.str_sum_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
declare i32 @puts(ptr)
|
||||
declare ptr @malloc(i64)
|
||||
|
||||
define i64 @ail_sum(i64 %arg_n) {
|
||||
define i64 @ail_sum_sum(i64 %arg_n) {
|
||||
entry:
|
||||
%v1 = icmp eq i64 %arg_n, 0
|
||||
br i1 %v1, label %then.2, label %else.2
|
||||
@@ -16,7 +16,7 @@ then.2:
|
||||
br label %join.2
|
||||
else.2:
|
||||
%v3 = sub i64 %arg_n, 1
|
||||
%v4 = call i64 @ail_sum(i64 %v3)
|
||||
%v4 = call i64 @ail_sum_sum(i64 %v3)
|
||||
%v5 = add i64 %arg_n, %v4
|
||||
br label %join.2
|
||||
join.2:
|
||||
@@ -24,15 +24,15 @@ join.2:
|
||||
ret i64 %v6
|
||||
}
|
||||
|
||||
define i8 @ail_main() {
|
||||
define i8 @ail_sum_main() {
|
||||
entry:
|
||||
%v1 = call i64 @ail_sum(i64 10)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_fmt_int_0, i64 %v1)
|
||||
%v1 = call i64 @ail_sum_sum(i64 10)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_sum_fmt_int_0, i64 %v1)
|
||||
ret i8 0
|
||||
}
|
||||
|
||||
|
||||
define i32 @main() {
|
||||
call i8 @ail_main()
|
||||
call i8 @ail_sum_main()
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
; AILang generated workspace; entry: ws_main
|
||||
source_filename = "ws_main.ail"
|
||||
target triple = "<NORMALIZED>"
|
||||
|
||||
@.str_ws_main_fmt_int_0 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
declare i32 @puts(ptr)
|
||||
declare ptr @malloc(i64)
|
||||
|
||||
define i64 @ail_ws_lib_add(i64 %arg_a, i64 %arg_b) {
|
||||
entry:
|
||||
%v1 = add i64 %arg_a, %arg_b
|
||||
ret i64 %v1
|
||||
}
|
||||
|
||||
define i8 @ail_ws_main_main() {
|
||||
entry:
|
||||
%v1 = call i64 @ail_ws_lib_add(i64 2, i64 3)
|
||||
call i32 (ptr, ...) @printf(ptr @.str_ws_main_fmt_int_0, i64 %v1)
|
||||
ret i8 0
|
||||
}
|
||||
|
||||
|
||||
define i32 @main() {
|
||||
call i8 @ail_ws_main_main()
|
||||
ret i32 0
|
||||
}
|
||||
Reference in New Issue
Block a user