lang: introduce cstring — the C-boundary string (Odin model)
cstring is ONE pointer to a null-terminated u8 buffer, C's char*: thin (8 bytes, no length; cstring_len walks to the terminator), crossing #foreign boundaries verbatim in both directions, with ?cstring as the nullable case lowering to the same bare pointer (null = absent). Conversion discipline mirrors Odin: a string LITERAL coerces implicitly (its bytes are terminated constants); any other string is rejected with a diagnostic naming to_cstring (it may be an unterminated view); and cstring never coerces to string implicitly — from_cstring(c) is the explicit zero-copy view, pricing the strlen. Plumbing: TypeId/TypeInfo builtin slot 18 (first_user 19), name classifiers, size/align/name tables, LLVM ptr lowering, the ?T pointer niche, the xx pointer ladder, the literal-gated coercion plan (isConstString + data_ptr), and the reserved-spelling set. std gains cstring_len/from_cstring/to_cstring (fmt.sx, re-exported); the old cstring(size) allocator helper is renamed alloc_string everywhere; getenv migrates to (name: cstring) -> ?cstring as the canonical user and env() drops its manual strlen/memcpy. Pinned: examples/1222 (FFI both directions, literal coercion, ?cstring null paths, round trip) and examples/1173 (both coercion diagnostics); FAIL pre-feature. The alloc_string rename + getenv signature shift the .ir snapshots — regenerated. zig build test 426/426; run_examples 604/604. Spec: reserved spelling + cstring section + C-interop rows.
This commit is contained in:
13
examples/1173-diagnostics-cstring-coercions.sx
Normal file
13
examples/1173-diagnostics-cstring-coercions.sx
Normal file
@@ -0,0 +1,13 @@
|
||||
// cstring's coercion discipline (Odin-style): only a string LITERAL
|
||||
// converts implicitly — an arbitrary string may be an unterminated view
|
||||
// (use to_cstring); and cstring never converts to string implicitly —
|
||||
// the length is an O(n) strlen the code must ask for (from_cstring).
|
||||
#import "modules/std.sx";
|
||||
|
||||
main :: () -> i32 {
|
||||
s := concat("a", "b");
|
||||
c : cstring = s; // error: non-literal string -> cstring
|
||||
t : string = c; // error: cstring -> string
|
||||
print("{}{}\n", t, cstring_len(c));
|
||||
return 0;
|
||||
}
|
||||
38
examples/1222-ffi-cstring-type.sx
Normal file
38
examples/1222-ffi-cstring-type.sx
Normal file
@@ -0,0 +1,38 @@
|
||||
// The `cstring` type: ONE pointer to a null-terminated u8 buffer — C's
|
||||
// `char *`. Crosses #foreign boundaries verbatim in both directions;
|
||||
// `?cstring` is the nullable case (null pointer = absent); string
|
||||
// LITERALS coerce implicitly (terminated constants); arbitrary strings
|
||||
// materialize via to_cstring; from_cstring is the zero-copy view back.
|
||||
#import "modules/std.sx";
|
||||
|
||||
libc :: #library "c";
|
||||
strerror_c :: (code: i32) -> cstring #foreign libc "strerror";
|
||||
getenv_c :: (name: cstring) -> ?cstring #foreign libc "getenv";
|
||||
dlerror_c :: () -> ?cstring #foreign libc "dlerror";
|
||||
|
||||
main :: () -> i32 {
|
||||
// literal -> cstring param; cstring return -> view
|
||||
e := strerror_c(2);
|
||||
v := from_cstring(e);
|
||||
if v.len < 5 { print("BUG: strerror short\n"); return 1; }
|
||||
print("strerror ok\n");
|
||||
|
||||
// ?cstring: present, absent, and null-returning C call
|
||||
p := getenv_c("PATH");
|
||||
if p == null { print("BUG: PATH null\n"); return 2; }
|
||||
if cstring_len(p!) < 1 { print("BUG: PATH empty\n"); return 3; }
|
||||
q := getenv_c("NO_SUCH_VAR_ZZZ");
|
||||
if q != null { print("BUG: missing not null\n"); return 4; }
|
||||
d := dlerror_c();
|
||||
if d != null { print("BUG: dlerror non-null\n"); return 5; }
|
||||
print("?cstring ok\n");
|
||||
|
||||
// round trip: built string -> owned cstring -> view -> equality
|
||||
s := concat("hi-", "there");
|
||||
c := to_cstring(s);
|
||||
r := from_cstring(c);
|
||||
if r != "hi-there" { print("BUG: round trip\n"); return 6; }
|
||||
if cstring_len(c) != 8 { print("BUG: len\n"); return 7; }
|
||||
print("round trip ok\n");
|
||||
return 0;
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
1
|
||||
11
examples/expected/1173-diagnostics-cstring-coercions.stderr
Normal file
11
examples/expected/1173-diagnostics-cstring-coercions.stderr
Normal file
@@ -0,0 +1,11 @@
|
||||
error: only a string LITERAL coerces to 'cstring' implicitly; an arbitrary string may be an unterminated view — materialize it with to_cstring(s)
|
||||
--> examples/1173-diagnostics-cstring-coercions.sx:9:5
|
||||
|
|
||||
9 | c : cstring = s; // error: non-literal string -> cstring
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: 'cstring' does not coerce to 'string' implicitly (the length is implicit); convert with from_cstring(c)
|
||||
--> examples/1173-diagnostics-cstring-coercions.sx:10:5
|
||||
|
|
||||
10 | t : string = c; // error: cstring -> string
|
||||
| ^^^^^^^^^^^^^^^
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -16,7 +16,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @cstring(ptr, i64) #0
|
||||
declare ptr @alloc_string(ptr, i64) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @int_to_string(ptr, i64) #0
|
||||
@@ -45,6 +45,15 @@ declare ptr @concat(ptr, ptr, ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @substr(ptr, ptr, i64, i64) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -266,9 +275,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
1
examples/expected/1222-ffi-cstring-type.exit
Normal file
1
examples/expected/1222-ffi-cstring-type.exit
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
1
examples/expected/1222-ffi-cstring-type.stderr
Normal file
1
examples/expected/1222-ffi-cstring-type.stderr
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
3
examples/expected/1222-ffi-cstring-type.stdout
Normal file
3
examples/expected/1222-ffi-cstring-type.stdout
Normal file
@@ -0,0 +1,3 @@
|
||||
strerror ok
|
||||
?cstring ok
|
||||
round trip ok
|
||||
@@ -48,7 +48,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -99,7 +99,7 @@ if.merge.15: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -203,7 +203,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -234,7 +234,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -249,6 +249,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -758,9 +767,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -115,7 +115,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -219,7 +219,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -250,7 +250,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -265,6 +265,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -774,9 +783,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.15: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -66,7 +66,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -117,7 +117,7 @@ if.merge.15: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -221,7 +221,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -252,7 +252,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -267,6 +267,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -776,9 +785,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -93,7 +93,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -197,7 +197,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -228,7 +228,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -243,6 +243,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -752,9 +761,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
||||
define internal { ptr, i64 } @alloc_string(ptr %0, i64 %1) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %1, ptr %alloca, align 8
|
||||
@@ -91,7 +91,7 @@ if.merge.17: ; preds = %entry
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
%icmpN = icmp slt i64 %loadN, 0
|
||||
store i1 %icmpN, ptr %allocaN, align 1
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 20)
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
store i64 19, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %alloca, align 8
|
||||
@@ -195,7 +195,7 @@ entry:
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%loadN = load i64, ptr %allocaN, align 8
|
||||
%add = add i64 %loadN, %loadN
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %add)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -226,7 +226,7 @@ entry:
|
||||
%allocaN = alloca i64, align 8
|
||||
store i64 %3, ptr %allocaN, align 8
|
||||
%load = load i64, ptr %allocaN, align 8
|
||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
||||
%call = call { ptr, i64 } @alloc_string(ptr %0, i64 %load)
|
||||
%allocaN = alloca { ptr, i64 }, align 8
|
||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||
@@ -241,6 +241,15 @@ entry:
|
||||
ret { ptr, i64 } %loadN
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -750,9 +759,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ declare ptr @memset(ptr, i32, i64)
|
||||
declare void @out.1(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @cstring(ptr, i64) #0
|
||||
declare ptr @alloc_string(ptr, i64) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @int_to_string(ptr, i64) #0
|
||||
@@ -52,6 +52,15 @@ declare ptr @concat(ptr, ptr, ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @substr(ptr, ptr, i64, i64) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @cstring_len(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @from_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @to_cstring(ptr, ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @path_join(ptr, ptr) #0
|
||||
|
||||
@@ -273,9 +282,6 @@ declare i32 @feof(ptr) #0
|
||||
; Function Attrs: nounwind
|
||||
declare ptr @getenv(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i64 @strlen(ptr) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare i32 @system(ptr) #0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user