mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
1126 lines
43 KiB
C
1126 lines
43 KiB
C
// #target: macos-x64
|
|
module test;
|
|
import std;
|
|
import libc;
|
|
|
|
struct Doc { Head *head; }
|
|
struct Head { char[]* title; }
|
|
|
|
struct Summary
|
|
{
|
|
char[]* title;
|
|
bool ok;
|
|
}
|
|
|
|
fn void Summary.print(Summary *s, CFile out)
|
|
{
|
|
// We don't have a native printf in C3 yet, so use libc,
|
|
// which is not all that nice for the strings but...
|
|
char[] title = s.title ? *s.title : "missing";
|
|
libc::fprintf(out, "Summary({ .title = %.*s, .ok = %s})", (int)title.len, title.ptr, s.ok ? (char*)"true" : (char*)"false");
|
|
}
|
|
|
|
fn bool contains(char[] haystack, char[] needle)
|
|
{
|
|
usz len = haystack.len;
|
|
usz needle_len = needle.len;
|
|
if (len < needle_len) return false;
|
|
if (!needle_len) return true;
|
|
len -= needle_len - 1;
|
|
for (usz i = 0; i < len; i++)
|
|
{
|
|
if (libc::memcmp(&haystack[i], needle.ptr, needle_len) == 0)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
macro dupe(value)
|
|
{
|
|
$typeof(&value) temp = malloc($sizeof(value));
|
|
if (!temp) return ReadError.OUT_OF_MEMORY!;
|
|
*temp = value;
|
|
return temp;
|
|
}
|
|
|
|
fault ReadError
|
|
{
|
|
BAD_READ,
|
|
OUT_OF_MEMORY
|
|
}
|
|
|
|
fn Doc! readDoc(char[] url)
|
|
{
|
|
if (contains(url, "fail")) return ReadError.BAD_READ!;
|
|
if (contains(url, "head-missing")) return { .head = null };
|
|
if (contains(url, "title-missing")) return { dupe(Head { .title = null })? };
|
|
if (contains(url, "title-empty")) return { dupe(Head { .title = dupe((char[])"")? })? };
|
|
// Not particularly elegant due to missing string functions.
|
|
int len = libc::snprintf(null, 0, "Title of %.*s", (int)url.len, url.ptr);
|
|
char* str = malloc(len + 1);
|
|
if (!str) return ReadError.OUT_OF_MEMORY!;
|
|
libc::snprintf(str, len + 1, "Title of %.*s", (int)url.len, url.ptr);
|
|
return { dupe(Head { .title = dupe(str[..len - 1])? })? };
|
|
}
|
|
|
|
fn Summary buildSummary(Doc doc)
|
|
{
|
|
return Summary {
|
|
.title = doc.head ? doc.head.title : null,
|
|
.ok = true,
|
|
};
|
|
}
|
|
|
|
fn Summary readAndBuildSummary(char[] url)
|
|
{
|
|
return buildSummary(readDoc(url)) ?? Summary { .title = null, .ok = false };
|
|
/*
|
|
// or
|
|
Summary summary = buildSummary(readDoc(url));
|
|
if (catch summary) return Summary { .title = null, .ok = false };
|
|
return summary;
|
|
// or
|
|
Summary summary = buildSummary(readDoc(url));
|
|
if (try summary) return summary;
|
|
return Summary { .title = null, .ok = false };
|
|
*/
|
|
}
|
|
|
|
|
|
fault TitleResult
|
|
{
|
|
TITLE_MISSING
|
|
}
|
|
|
|
fn bool! isTitleNonEmpty(Doc doc)
|
|
{
|
|
if (!doc.head) return TitleResult.TITLE_MISSING!;
|
|
char[]* head = doc.head.title;
|
|
if (!head) return TitleResult.TITLE_MISSING!;
|
|
return (*head).len > 0;
|
|
}
|
|
|
|
|
|
fn bool! readWhetherTitleNonEmpty(char[] url)
|
|
{
|
|
return isTitleNonEmpty(readDoc(url));
|
|
}
|
|
|
|
fn char* bool_to_string(bool b)
|
|
{
|
|
return b ? "true" : "false";
|
|
}
|
|
fn char* nameFromError(anyerr e)
|
|
{
|
|
switch (e)
|
|
{
|
|
case TitleResult.TITLE_MISSING:
|
|
return "no title";
|
|
case ReadError.BAD_READ:
|
|
return "bad read";
|
|
case ReadError.OUT_OF_MEMORY:
|
|
return "out of memory";
|
|
default:
|
|
return "unknown error";
|
|
}
|
|
}
|
|
|
|
|
|
fn void main()
|
|
{
|
|
const char[][] URLS = { "good", "title-empty", "title-missing", "head-missing", "fail" };
|
|
foreach (char[] url : URLS)
|
|
{
|
|
// Yes, it's pretty onerous to print strings for the moment in C3
|
|
libc::printf(`Checking "https://%.*s/":` "\n", (int)url.len, url.ptr);
|
|
Summary summary = readAndBuildSummary(url);
|
|
libc::printf(" Summary: ");
|
|
summary.print(libc::stdout());
|
|
libc::printf("\n");
|
|
char[] title_sure = summary.title ? *summary.title : "";
|
|
libc::printf(" Title: %.*s\n", (int)title_sure.len, title_sure.ptr);
|
|
bool! has_title = readWhetherTitleNonEmpty(url);
|
|
// This looks a bit less than elegant, but as you see it's mostly due to having to
|
|
// use printf here.
|
|
libc::printf(" Has title: %s vs %s\n", bool_to_string(has_title) ?? nameFromError(catch? has_title), (has_title ?? false) ? (char*)"true" : (char*)"false");
|
|
}
|
|
}
|
|
|
|
/* #expect: test.ll
|
|
|
|
define void @test.Summary.print(ptr %0, ptr %1) #0 {
|
|
entry:
|
|
%title = alloca %"char[]", align 8
|
|
%2 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0
|
|
%3 = load ptr, ptr %2, align 8
|
|
%ptrbool = icmp ne ptr %3, null
|
|
br i1 %ptrbool, label %cond.lhs, label %cond.rhs
|
|
|
|
cond.lhs: ; preds = %entry
|
|
%4 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0
|
|
%5 = load ptr, ptr %4, align 8
|
|
%6 = load %"char[]", ptr %5, align 8
|
|
br label %cond.phi
|
|
|
|
cond.rhs: ; preds = %entry
|
|
br label %cond.phi
|
|
|
|
cond.phi: ; preds = %cond.rhs, %cond.lhs
|
|
%val = phi %"char[]" [ %6, %cond.lhs ], [ { ptr @.str.41, i64 7 }, %cond.rhs ]
|
|
store %"char[]" %val, ptr %title, align 8
|
|
%7 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 1
|
|
%8 = load i64, ptr %7, align 8
|
|
%trunc = trunc i64 %8 to i32
|
|
%9 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 0
|
|
%10 = load ptr, ptr %9, align 8
|
|
%11 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 1
|
|
%12 = load i8, ptr %11, align 8
|
|
%13 = trunc i8 %12 to i1
|
|
%ternary = select i1 %13, ptr @.str.43, ptr @.str.44
|
|
%14 = call i32 (ptr, ptr, ...) @fprintf(ptr %1, ptr @.str.42, i32 %trunc, ptr %10, ptr %ternary)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define zeroext i8 @test.contains(ptr %0, i64 %1, ptr %2, i64 %3) #0 {
|
|
entry:
|
|
%haystack = alloca %"char[]", align 8
|
|
%needle = alloca %"char[]", align 8
|
|
%len = alloca i64, align 8
|
|
%needle_len = alloca i64, align 8
|
|
%i = alloca i64, align 8
|
|
store ptr %0, ptr %haystack, align 8
|
|
%ptroffset = getelementptr inbounds i64, ptr %haystack, i64 1
|
|
store i64 %1, ptr %ptroffset, align 8
|
|
store ptr %2, ptr %needle, align 8
|
|
%ptroffset1 = getelementptr inbounds i64, ptr %needle, i64 1
|
|
store i64 %3, ptr %ptroffset1, align 8
|
|
%4 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 1
|
|
%5 = load i64, ptr %4, align 8
|
|
store i64 %5, ptr %len, align 8
|
|
%6 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 1
|
|
%7 = load i64, ptr %6, align 8
|
|
store i64 %7, ptr %needle_len, align 8
|
|
%8 = load i64, ptr %len, align 8
|
|
%9 = load i64, ptr %needle_len, align 8
|
|
%lt = icmp ult i64 %8, %9
|
|
br i1 %lt, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %entry
|
|
ret i8 0
|
|
|
|
if.exit: ; preds = %entry
|
|
%10 = load i64, ptr %needle_len, align 8
|
|
%not = icmp eq i64 %10, 0
|
|
br i1 %not, label %if.then2, label %if.exit3
|
|
|
|
if.then2: ; preds = %if.exit
|
|
ret i8 1
|
|
|
|
if.exit3: ; preds = %if.exit
|
|
%11 = load i64, ptr %len, align 8
|
|
%12 = load i64, ptr %needle_len, align 8
|
|
%sub = sub i64 %12, 1
|
|
%sub4 = sub i64 %11, %sub
|
|
store i64 %sub4, ptr %len, align 8
|
|
store i64 0, ptr %i, align 8
|
|
br label %loop.cond
|
|
|
|
loop.cond: ; preds = %if.exit8, %if.exit3
|
|
%13 = load i64, ptr %i, align 8
|
|
%14 = load i64, ptr %len, align 8
|
|
%lt5 = icmp ult i64 %13, %14
|
|
br i1 %lt5, label %loop.body, label %loop.exit
|
|
|
|
loop.body: ; preds = %loop.cond
|
|
%15 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 0
|
|
%16 = load ptr, ptr %15, align 8
|
|
%17 = load i64, ptr %i, align 8
|
|
%ptroffset6 = getelementptr inbounds i8, ptr %16, i64 %17
|
|
%18 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 0
|
|
%19 = load ptr, ptr %18, align 8
|
|
%20 = load i64, ptr %needle_len, align 8
|
|
%21 = call i32 @memcmp(ptr %ptroffset6, ptr %19, i64 %20)
|
|
%eq = icmp eq i32 %21, 0
|
|
br i1 %eq, label %if.then7, label %if.exit8
|
|
|
|
if.then7: ; preds = %loop.body
|
|
ret i8 1
|
|
|
|
if.exit8: ; preds = %loop.body
|
|
%22 = load i64, ptr %i, align 8
|
|
%add = add i64 %22, 1
|
|
store i64 %add, ptr %i, align 8
|
|
br label %loop.cond
|
|
|
|
loop.exit: ; preds = %loop.cond
|
|
ret i8 0
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i64 @test.readDoc(ptr %0, ptr %1, i64 %2) #0 {
|
|
entry:
|
|
%url = alloca %"char[]", align 8
|
|
%reterr = alloca i64, align 8
|
|
%literal = alloca %Doc, align 8
|
|
%reterr8 = alloca i64, align 8
|
|
%literal9 = alloca %Doc, align 8
|
|
%error_var = alloca i64, align 8
|
|
%value = alloca %Head, align 8
|
|
%literal10 = alloca %Head, align 8
|
|
%temp = alloca ptr, align 8
|
|
%using = alloca ptr, align 8
|
|
%end_padding = alloca i64, align 8
|
|
%error_var13 = alloca i64, align 8
|
|
%using14 = alloca ptr, align 8
|
|
%end_padding15 = alloca i64, align 8
|
|
%.anon = alloca i64, align 8
|
|
%blockret16 = alloca ptr, align 8
|
|
%retparam = alloca ptr, align 8
|
|
%reterr24 = alloca i64, align 8
|
|
%literal25 = alloca %Doc, align 8
|
|
%error_var26 = alloca i64, align 8
|
|
%value27 = alloca %Head, align 8
|
|
%literal28 = alloca %Head, align 8
|
|
%error_var29 = alloca i64, align 8
|
|
%value30 = alloca %"char[]", align 8
|
|
%temp31 = alloca ptr, align 8
|
|
%using32 = alloca ptr, align 8
|
|
%end_padding34 = alloca i64, align 8
|
|
%error_var36 = alloca i64, align 8
|
|
%using37 = alloca ptr, align 8
|
|
%end_padding38 = alloca i64, align 8
|
|
%.anon39 = alloca i64, align 8
|
|
%blockret40 = alloca ptr, align 8
|
|
%retparam41 = alloca ptr, align 8
|
|
%temp54 = alloca ptr, align 8
|
|
%using55 = alloca ptr, align 8
|
|
%end_padding57 = alloca i64, align 8
|
|
%error_var59 = alloca i64, align 8
|
|
%using60 = alloca ptr, align 8
|
|
%end_padding61 = alloca i64, align 8
|
|
%.anon62 = alloca i64, align 8
|
|
%blockret63 = alloca ptr, align 8
|
|
%retparam64 = alloca ptr, align 8
|
|
%len = alloca i32, align 4
|
|
%str = alloca ptr, align 8
|
|
%using78 = alloca ptr, align 8
|
|
%end_padding79 = alloca i64, align 8
|
|
%error_var80 = alloca i64, align 8
|
|
%using81 = alloca ptr, align 8
|
|
%end_padding82 = alloca i64, align 8
|
|
%.anon83 = alloca i32, align 4
|
|
%blockret85 = alloca ptr, align 8
|
|
%retparam86 = alloca ptr, align 8
|
|
%reterr100 = alloca i64, align 8
|
|
%literal101 = alloca %Doc, align 8
|
|
%error_var102 = alloca i64, align 8
|
|
%value103 = alloca %Head, align 8
|
|
%literal104 = alloca %Head, align 8
|
|
%error_var105 = alloca i64, align 8
|
|
%value106 = alloca %"char[]", align 8
|
|
%temp109 = alloca ptr, align 8
|
|
%using110 = alloca ptr, align 8
|
|
%end_padding112 = alloca i64, align 8
|
|
%error_var114 = alloca i64, align 8
|
|
%using115 = alloca ptr, align 8
|
|
%end_padding116 = alloca i64, align 8
|
|
%.anon117 = alloca i64, align 8
|
|
%blockret118 = alloca ptr, align 8
|
|
%retparam119 = alloca ptr, align 8
|
|
%temp132 = alloca ptr, align 8
|
|
%using133 = alloca ptr, align 8
|
|
%end_padding135 = alloca i64, align 8
|
|
%error_var137 = alloca i64, align 8
|
|
%using138 = alloca ptr, align 8
|
|
%end_padding139 = alloca i64, align 8
|
|
%.anon140 = alloca i64, align 8
|
|
%blockret141 = alloca ptr, align 8
|
|
%retparam142 = alloca ptr, align 8
|
|
store ptr %1, ptr %url, align 8
|
|
%ptroffset = getelementptr inbounds i64, ptr %url, i64 1
|
|
store i64 %2, ptr %ptroffset, align 8
|
|
%3 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo = load ptr, ptr %3, align 8
|
|
%4 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi = load i64, ptr %4, align 8
|
|
%5 = call i8 @test.contains(ptr %lo, i64 %hi, ptr @.str, i64 4)
|
|
%6 = trunc i8 %5 to i1
|
|
br i1 %6, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %entry
|
|
ret i64 ptrtoint (ptr @"test.ReadError$BAD_READ" to i64)
|
|
|
|
if.exit: ; preds = %entry
|
|
%7 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo1 = load ptr, ptr %7, align 8
|
|
%8 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi2 = load i64, ptr %8, align 8
|
|
%9 = call i8 @test.contains(ptr %lo1, i64 %hi2, ptr @.str.3, i64 12)
|
|
%10 = trunc i8 %9 to i1
|
|
br i1 %10, label %if.then3, label %if.exit4
|
|
|
|
if.then3: ; preds = %if.exit
|
|
%11 = getelementptr inbounds %Doc, ptr %literal, i32 0, i32 0
|
|
store ptr null, ptr %11, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal, i32 8, i1 false)
|
|
ret i64 0
|
|
|
|
if.exit4: ; preds = %if.exit
|
|
%12 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo5 = load ptr, ptr %12, align 8
|
|
%13 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi6 = load i64, ptr %13, align 8
|
|
%14 = call i8 @test.contains(ptr %lo5, i64 %hi6, ptr @.str.4, i64 13)
|
|
%15 = trunc i8 %14 to i1
|
|
br i1 %15, label %if.then7, label %if.exit20
|
|
|
|
if.then7: ; preds = %if.exit4
|
|
%16 = getelementptr inbounds %Doc, ptr %literal9, i32 0, i32 0
|
|
%17 = getelementptr inbounds %Head, ptr %literal10, i32 0, i32 0
|
|
store ptr null, ptr %17, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value, ptr align 8 %literal10, i32 8, i1 false)
|
|
%18 = load ptr, ptr @std.core.mem.thread_allocator, align 8
|
|
store ptr %18, ptr %using, align 8
|
|
store i64 0, ptr %end_padding, align 8
|
|
%19 = load ptr, ptr %using, align 8
|
|
store ptr %19, ptr %using14, align 8
|
|
%20 = load i64, ptr %end_padding, align 8
|
|
store i64 %20, ptr %end_padding15, align 8
|
|
store i64 8, ptr %.anon, align 8
|
|
%21 = load ptr, ptr %using14, align 8
|
|
%22 = load i64, ptr %.anon, align 8
|
|
%23 = load i64, ptr %end_padding15, align 8
|
|
%add = add i64 %22, %23
|
|
%24 = call i64 @std.core.mem.allocator.Allocator.alloc(ptr %retparam, ptr %21, i64 %add) #3
|
|
%not_err = icmp eq i64 %24, 0
|
|
%25 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %25, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %if.then7
|
|
store i64 %24, ptr %error_var13, align 8
|
|
br label %panic_block
|
|
|
|
after_check: ; preds = %if.then7
|
|
%26 = load ptr, ptr %retparam, align 8
|
|
store ptr %26, ptr %blockret16, align 8
|
|
br label %expr_block.exit
|
|
|
|
expr_block.exit: ; preds = %after_check
|
|
%27 = load ptr, ptr %blockret16, align 8
|
|
br label %noerr_block
|
|
|
|
panic_block: ; preds = %assign_optional
|
|
%28 = load ptr, ptr @std.core.builtin.panic, align 8
|
|
call void %28(ptr @.panic_msg, i64 27, ptr @.file, i64 6, ptr @.func
|
|
unreachable
|
|
|
|
noerr_block: ; preds = %expr_block.exit
|
|
store ptr %27, ptr %temp, align 8
|
|
%29 = load ptr, ptr %temp, align 8
|
|
%not = icmp eq ptr %29, null
|
|
br i1 %not, label %if.then17, label %if.exit18
|
|
|
|
if.then17: ; preds = %noerr_block
|
|
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var, align 8
|
|
br label %guard_block
|
|
|
|
if.exit18: ; preds = %noerr_block
|
|
%30 = load ptr, ptr %temp, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %30, ptr align 8 %value, i32 8, i1 false)
|
|
br label %noerr_block19
|
|
|
|
guard_block: ; preds = %if.then17
|
|
%31 = load i64, ptr %error_var, align 8
|
|
ret i64 %31
|
|
|
|
noerr_block19: ; preds = %if.exit18
|
|
%32 = load ptr, ptr %temp, align 8
|
|
store ptr %32, ptr %16, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal9, i32 8, i1 false)
|
|
ret i64 0
|
|
|
|
if.exit20: ; preds = %if.exit4
|
|
%33 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo21 = load ptr, ptr %33, align 8
|
|
%34 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi22 = load i64, ptr %34, align 8
|
|
%35 = call i8 @test.contains(ptr %lo21, i64 %hi22, ptr @.str.5, i64 11)
|
|
%36 = trunc i8 %35 to i1
|
|
br i1 %36, label %if.then23, label %if.exit77
|
|
|
|
if.then23: ; preds = %if.exit20
|
|
%37 = getelementptr inbounds %Doc, ptr %literal25, i32 0, i32 0
|
|
store ptr null, ptr %literal28, align 8
|
|
%38 = getelementptr inbounds %Head, ptr %literal28, i32 0, i32 0
|
|
store %"char[]" zeroinitializer, ptr %value30, align 8
|
|
%39 = load ptr, ptr @std.core.mem.thread_allocator, align 8
|
|
store ptr %39, ptr %using32, align 8
|
|
store i64 0, ptr %end_padding34, align 8
|
|
%40 = load ptr, ptr %using32, align 8
|
|
store ptr %40, ptr %using37, align 8
|
|
%41 = load i64, ptr %end_padding34, align 8
|
|
store i64 %41, ptr %end_padding38, align 8
|
|
store i64 16, ptr %.anon39, align 8
|
|
%42 = load ptr, ptr %using37, align 8
|
|
%43 = load i64, ptr %.anon39, align 8
|
|
%44 = load i64, ptr %end_padding38, align 8
|
|
%add42 = add i64 %43, %44
|
|
%45 = call i64 @std.core.mem.allocator.Allocator.alloc(ptr %retparam41, ptr %42, i64 %add42) #3
|
|
%not_err43 = icmp eq i64 %45, 0
|
|
%46 = call i1 @llvm.expect.i1(i1 %not_err43, i1 true)
|
|
br i1 %46, label %after_check45, label %assign_optional44
|
|
|
|
assign_optional44: ; preds = %if.then23
|
|
store i64 %45, ptr %error_var36, align 8
|
|
br label %panic_block47
|
|
|
|
after_check45: ; preds = %if.then23
|
|
%47 = load ptr, ptr %retparam41, align 8
|
|
store ptr %47, ptr %blockret40, align 8
|
|
br label %expr_block.exit46
|
|
|
|
expr_block.exit46: ; preds = %after_check45
|
|
%48 = load ptr, ptr %blockret40, align 8
|
|
br label %noerr_block48
|
|
|
|
panic_block47: ; preds = %assign_optional44
|
|
%49 = load ptr, ptr @std.core.builtin.panic, align 8
|
|
call void %49(ptr @.panic_msg.6, i64 27, ptr @.file.7, i64 6, ptr @.func.8, i64 7
|
|
unreachable
|
|
|
|
noerr_block48: ; preds = %expr_block.exit46
|
|
store ptr %48, ptr %temp31, align 8
|
|
%50 = load ptr, ptr %temp31, align 8
|
|
%not49 = icmp eq ptr %50, null
|
|
br i1 %not49, label %if.then50, label %if.exit51
|
|
|
|
if.then50: ; preds = %noerr_block48
|
|
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var29, align 8
|
|
br label %guard_block52
|
|
|
|
if.exit51: ; preds = %noerr_block48
|
|
%51 = load ptr, ptr %temp31, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %51, ptr align 8 %value30, i32 16, i1 false)
|
|
br label %noerr_block53
|
|
|
|
guard_block52: ; preds = %if.then50
|
|
%52 = load i64, ptr %error_var29, align 8
|
|
ret i64 %52
|
|
|
|
noerr_block53: ; preds = %if.exit51
|
|
%53 = load ptr, ptr %temp31, align 8
|
|
store ptr %53, ptr %38, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value27, ptr align 8 %literal28, i32 8, i1 false)
|
|
%54 = load ptr, ptr @std.core.mem.thread_allocator, align 8
|
|
store ptr %54, ptr %using55, align 8
|
|
store i64 0, ptr %end_padding57, align 8
|
|
%55 = load ptr, ptr %using55, align 8
|
|
store ptr %55, ptr %using60, align 8
|
|
%56 = load i64, ptr %end_padding57, align 8
|
|
store i64 %56, ptr %end_padding61, align 8
|
|
store i64 8, ptr %.anon62, align 8
|
|
%57 = load ptr, ptr %using60, align 8
|
|
%58 = load i64, ptr %.anon62, align 8
|
|
%59 = load i64, ptr %end_padding61, align 8
|
|
%add65 = add i64 %58, %59
|
|
%60 = call i64 @std.core.mem.allocator.Allocator.alloc(ptr %retparam64, ptr %57, i64 %add65) #3
|
|
%not_err66 = icmp eq i64 %60, 0
|
|
%61 = call i1 @llvm.expect.i1(i1 %not_err66, i1 true)
|
|
br i1 %61, label %after_check68, label %assign_optional67
|
|
|
|
assign_optional67: ; preds = %noerr_block53
|
|
store i64 %60, ptr %error_var59, align 8
|
|
br label %panic_block70
|
|
|
|
after_check68: ; preds = %noerr_block53
|
|
%62 = load ptr, ptr %retparam64, align 8
|
|
store ptr %62, ptr %blockret63, align 8
|
|
br label %expr_block.exit69
|
|
|
|
expr_block.exit69: ; preds = %after_check68
|
|
%63 = load ptr, ptr %blockret63, align 8
|
|
br label %noerr_block71
|
|
|
|
panic_block70: ; preds = %assign_optional67
|
|
%64 = load ptr, ptr @std.core.builtin.panic, align 8
|
|
call void %64(ptr @.panic_msg.9, i64 27, ptr @.file.10, i64 6, ptr @.func.11, i64 7
|
|
unreachable
|
|
|
|
noerr_block71: ; preds = %expr_block.exit69
|
|
store ptr %63, ptr %temp54, align 8
|
|
%65 = load ptr, ptr %temp54, align 8
|
|
%not72 = icmp eq ptr %65, null
|
|
br i1 %not72, label %if.then73, label %if.exit74
|
|
|
|
if.then73: ; preds = %noerr_block71
|
|
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var26, align 8
|
|
br label %guard_block75
|
|
|
|
if.exit74: ; preds = %noerr_block71
|
|
%66 = load ptr, ptr %temp54, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %66, ptr align 8 %value27, i32 8, i1 false)
|
|
br label %noerr_block76
|
|
|
|
guard_block75: ; preds = %if.then73
|
|
%67 = load i64, ptr %error_var26, align 8
|
|
ret i64 %67
|
|
|
|
noerr_block76: ; preds = %if.exit74
|
|
%68 = load ptr, ptr %temp54, align 8
|
|
store ptr %68, ptr %37, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal25, i32 8, i1 false)
|
|
ret i64 0
|
|
|
|
if.exit77: ; preds = %if.exit20
|
|
%69 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%70 = load i64, ptr %69, align 8
|
|
%trunc = trunc i64 %70 to i32
|
|
%71 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%72 = load ptr, ptr %71, align 8
|
|
%73 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @.str.12, i32 %trunc, ptr %72)
|
|
store i32 %73, ptr %len, align 4
|
|
%74 = load ptr, ptr @std.core.mem.thread_allocator, align 8
|
|
store ptr %74, ptr %using78, align 8
|
|
store i64 0, ptr %end_padding79, align 8
|
|
%75 = load ptr, ptr %using78, align 8
|
|
store ptr %75, ptr %using81, align 8
|
|
%76 = load i64, ptr %end_padding79, align 8
|
|
store i64 %76, ptr %end_padding82, align 8
|
|
%77 = load i32, ptr %len, align 4
|
|
%add84 = add i32 %77, 1
|
|
store i32 %add84, ptr %.anon83, align 4
|
|
%78 = load ptr, ptr %using81, align 8
|
|
%79 = load i32, ptr %.anon83, align 4
|
|
%sext = sext i32 %79 to i64
|
|
%80 = load i64, ptr %end_padding82, align 8
|
|
%add87 = add i64 %sext, %80
|
|
%81 = call i64 @std.core.mem.allocator.Allocator.alloc(ptr %retparam86, ptr %78, i64 %add87) #3
|
|
%not_err88 = icmp eq i64 %81, 0
|
|
%82 = call i1 @llvm.expect.i1(i1 %not_err88, i1 true)
|
|
br i1 %82, label %after_check90, label %assign_optional89
|
|
|
|
assign_optional89: ; preds = %if.exit77
|
|
store i64 %81, ptr %error_var80, align 8
|
|
br label %panic_block92
|
|
|
|
after_check90: ; preds = %if.exit77
|
|
%83 = load ptr, ptr %retparam86, align 8
|
|
store ptr %83, ptr %blockret85, align 8
|
|
br label %expr_block.exit91
|
|
|
|
expr_block.exit91: ; preds = %after_check90
|
|
%84 = load ptr, ptr %blockret85, align 8
|
|
br label %noerr_block93
|
|
|
|
panic_block92: ; preds = %assign_optional89
|
|
%85 = load ptr, ptr @std.core.builtin.panic, align 8
|
|
call void %85(ptr @.panic_msg.13, i64 27, ptr @.file.14, i64 6, ptr @.func.15
|
|
unreachable
|
|
|
|
noerr_block93: ; preds = %expr_block.exit91
|
|
store ptr %84, ptr %str, align 8
|
|
%86 = load ptr, ptr %str, align 8
|
|
%not94 = icmp eq ptr %86, null
|
|
br i1 %not94, label %if.then95, label %if.exit96
|
|
|
|
if.then95: ; preds = %noerr_block93
|
|
ret i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64)
|
|
|
|
if.exit96: ; preds = %noerr_block93
|
|
%87 = load ptr, ptr %str, align 8
|
|
%88 = load i32, ptr %len, align 4
|
|
%sext97 = sext i32 %88 to i64
|
|
%add98 = add i64 %sext97, 1
|
|
%89 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%90 = load i64, ptr %89, align 8
|
|
%trunc99 = trunc i64 %90 to i32
|
|
%91 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%92 = load ptr, ptr %91, align 8
|
|
%93 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr %87, i64 %add98, ptr @.str.16, i32 %trunc99, ptr %92)
|
|
%94 = getelementptr inbounds %Doc, ptr %literal101, i32 0, i32 0
|
|
store ptr null, ptr %literal104, align 8
|
|
%95 = getelementptr inbounds %Head, ptr %literal104, i32 0, i32 0
|
|
%96 = load ptr, ptr %str, align 8
|
|
%97 = load i32, ptr %len, align 4
|
|
%sub = sub i32 %97, 1
|
|
%sext107 = sext i32 %sub to i64
|
|
%98 = add i64 %sext107, 1
|
|
%size = sub i64 %98, 0
|
|
%ptroffset108 = getelementptr inbounds i8, ptr %96, i64 0
|
|
%99 = insertvalue %"char[]" undef, ptr %ptroffset108, 0
|
|
%100 = insertvalue %"char[]" %99, i64 %size, 1
|
|
store %"char[]" %100, ptr %value106, align 8
|
|
%101 = load ptr, ptr @std.core.mem.thread_allocator, align 8
|
|
store ptr %101, ptr %using110, align 8
|
|
store i64 0, ptr %end_padding112, align 8
|
|
%102 = load ptr, ptr %using110, align 8
|
|
store ptr %102, ptr %using115, align 8
|
|
%103 = load i64, ptr %end_padding112, align 8
|
|
store i64 %103, ptr %end_padding116, align 8
|
|
store i64 16, ptr %.anon117, align 8
|
|
%104 = load ptr, ptr %using115, align 8
|
|
%105 = load i64, ptr %.anon117, align 8
|
|
%106 = load i64, ptr %end_padding116, align 8
|
|
%add120 = add i64 %105, %106
|
|
%107 = call i64 @std.core.mem.allocator.Allocator.alloc(ptr %retparam119, ptr %104, i64 %add120) #3
|
|
%not_err121 = icmp eq i64 %107, 0
|
|
%108 = call i1 @llvm.expect.i1(i1 %not_err121, i1 true)
|
|
br i1 %108, label %after_check123, label %assign_optional122
|
|
|
|
assign_optional122: ; preds = %if.exit96
|
|
store i64 %107, ptr %error_var114, align 8
|
|
br label %panic_block125
|
|
|
|
after_check123: ; preds = %if.exit96
|
|
%109 = load ptr, ptr %retparam119, align 8
|
|
store ptr %109, ptr %blockret118, align 8
|
|
br label %expr_block.exit124
|
|
|
|
expr_block.exit124: ; preds = %after_check123
|
|
%110 = load ptr, ptr %blockret118, align 8
|
|
br label %noerr_block126
|
|
|
|
panic_block125: ; preds = %assign_optional122
|
|
%111 = load ptr, ptr @std.core.builtin.panic, align 8
|
|
call void %111(ptr @.panic_msg.17, i64 27, ptr @.file.18, i64 6, ptr @.func.19
|
|
unreachable
|
|
|
|
noerr_block126: ; preds = %expr_block.exit124
|
|
store ptr %110, ptr %temp109, align 8
|
|
%112 = load ptr, ptr %temp109, align 8
|
|
%not127 = icmp eq ptr %112, null
|
|
br i1 %not127, label %if.then128, label %if.exit129
|
|
|
|
if.then128: ; preds = %noerr_block126
|
|
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var105, align 8
|
|
br label %guard_block130
|
|
|
|
if.exit129: ; preds = %noerr_block126
|
|
%113 = load ptr, ptr %temp109, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %113, ptr align 8 %value106, i32 16, i1 false)
|
|
br label %noerr_block131
|
|
|
|
guard_block130: ; preds = %if.then128
|
|
%114 = load i64, ptr %error_var105, align 8
|
|
ret i64 %114
|
|
|
|
noerr_block131: ; preds = %if.exit129
|
|
%115 = load ptr, ptr %temp109, align 8
|
|
store ptr %115, ptr %95, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value103, ptr align 8 %literal104, i32 8, i1 false)
|
|
%116 = load ptr, ptr @std.core.mem.thread_allocator, align 8
|
|
store ptr %116, ptr %using133, align 8
|
|
store i64 0, ptr %end_padding135, align 8
|
|
%117 = load ptr, ptr %using133, align 8
|
|
store ptr %117, ptr %using138, align 8
|
|
%118 = load i64, ptr %end_padding135, align 8
|
|
store i64 %118, ptr %end_padding139, align 8
|
|
store i64 8, ptr %.anon140, align 8
|
|
%119 = load ptr, ptr %using138, align 8
|
|
%120 = load i64, ptr %.anon140, align 8
|
|
%121 = load i64, ptr %end_padding139, align 8
|
|
%add143 = add i64 %120, %121
|
|
%122 = call i64 @std.core.mem.allocator.Allocator.alloc(ptr %retparam142, ptr %119, i64 %add143) #3
|
|
%not_err144 = icmp eq i64 %122, 0
|
|
%123 = call i1 @llvm.expect.i1(i1 %not_err144, i1 true)
|
|
br i1 %123, label %after_check146, label %assign_optional145
|
|
|
|
assign_optional145: ; preds = %noerr_block131
|
|
store i64 %122, ptr %error_var137, align 8
|
|
br label %panic_block148
|
|
|
|
after_check146: ; preds = %noerr_block131
|
|
%124 = load ptr, ptr %retparam142, align 8
|
|
store ptr %124, ptr %blockret141, align 8
|
|
br label %expr_block.exit147
|
|
|
|
expr_block.exit147: ; preds = %after_check146
|
|
%125 = load ptr, ptr %blockret141, align 8
|
|
br label %noerr_block149
|
|
|
|
panic_block148: ; preds = %assign_optional145
|
|
%126 = load ptr, ptr @std.core.builtin.panic, align 8
|
|
call void %126(ptr @.panic_msg.20, i64 27, ptr @.file.21, i64 6, ptr @.func.22
|
|
unreachable
|
|
|
|
noerr_block149: ; preds = %expr_block.exit147
|
|
store ptr %125, ptr %temp132, align 8
|
|
%127 = load ptr, ptr %temp132, align 8
|
|
%not150 = icmp eq ptr %127, null
|
|
br i1 %not150, label %if.then151, label %if.exit152
|
|
|
|
if.then151: ; preds = %noerr_block149
|
|
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var102, align 8
|
|
br label %guard_block153
|
|
|
|
if.exit152: ; preds = %noerr_block149
|
|
%128 = load ptr, ptr %temp132, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %128, ptr align 8 %value103, i32 8, i1 false)
|
|
br label %noerr_block154
|
|
|
|
guard_block153: ; preds = %if.then151
|
|
%129 = load i64, ptr %error_var102, align 8
|
|
ret i64 %129
|
|
|
|
noerr_block154: ; preds = %if.exit152
|
|
%130 = load ptr, ptr %temp132, align 8
|
|
store ptr %130, ptr %94, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal101, i32 8, i1 false)
|
|
ret i64 0
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define { ptr, i8 } @test.buildSummary(ptr %0) #0 {
|
|
entry:
|
|
%doc = alloca %Doc, align 8
|
|
%literal = alloca %Summary, align 8
|
|
store ptr %0, ptr %doc, align 8
|
|
%1 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0
|
|
store ptr null, ptr %1, align 8
|
|
%2 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1
|
|
store i8 0, ptr %2, align 8
|
|
%3 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0
|
|
%4 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
|
|
%5 = load ptr, ptr %4, align 8
|
|
%ptrbool = icmp ne ptr %5, null
|
|
br i1 %ptrbool, label %cond.lhs, label %cond.rhs
|
|
|
|
cond.lhs: ; preds = %entry
|
|
%6 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
|
|
%7 = load ptr, ptr %6, align 8
|
|
%8 = getelementptr inbounds %Head, ptr %7, i32 0, i32 0
|
|
%9 = load ptr, ptr %8, align 8
|
|
br label %cond.phi
|
|
|
|
cond.rhs: ; preds = %entry
|
|
br label %cond.phi
|
|
|
|
cond.phi: ; preds = %cond.rhs, %cond.lhs
|
|
%val = phi ptr [ %9, %cond.lhs ], [ null, %cond.rhs ]
|
|
store ptr %val, ptr %3, align 8
|
|
%10 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1
|
|
store i8 1, ptr %10, align 8
|
|
%11 = load { ptr, i8 }, ptr %literal, align 8
|
|
ret { ptr, i8 } %11
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define { ptr, i8 } @test.readAndBuildSummary(ptr %0, i64 %1) #0 {
|
|
entry:
|
|
%url = alloca %"char[]", align 8
|
|
%retparam = alloca %Doc, align 8
|
|
%result = alloca %Summary, align 8
|
|
%literal = alloca %Summary, align 8
|
|
%taddr = alloca %Summary, align 8
|
|
store ptr %0, ptr %url, align 8
|
|
%ptroffset = getelementptr inbounds i64, ptr %url, i64 1
|
|
store i64 %1, ptr %ptroffset, align 8
|
|
%2 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo = load ptr, ptr %2, align 8
|
|
%3 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi = load i64, ptr %3, align 8
|
|
%4 = call i64 @test.readDoc(ptr %retparam, ptr %lo, i64 %hi)
|
|
%not_err = icmp eq i64 %4, 0
|
|
%5 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %5, label %after_check, label %else_block
|
|
|
|
after_check: ; preds = %entry
|
|
%6 = load ptr, ptr %retparam, align 8
|
|
%7 = call { ptr, i8 } @test.buildSummary(ptr %6)
|
|
store { ptr, i8 } %7, ptr %result, align 8
|
|
%8 = load %Summary, ptr %result, align 8
|
|
br label %phi_block
|
|
|
|
else_block: ; preds = %entry
|
|
%9 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0
|
|
store ptr null, ptr %9, align 8
|
|
%10 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1
|
|
store i8 0, ptr %10, align 8
|
|
%11 = load %Summary, ptr %literal, align 8
|
|
br label %phi_block
|
|
|
|
phi_block: ; preds = %else_block, %after_check
|
|
%val = phi %Summary [ %8, %after_check ], [ %11, %else_block ]
|
|
store %Summary %val, ptr %taddr, align 8
|
|
%12 = load { ptr, i8 }, ptr %taddr, align 8
|
|
ret { ptr, i8 } %12
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i64 @test.isTitleNonEmpty(ptr %0, ptr %1) #0 {
|
|
entry:
|
|
%doc = alloca %Doc, align 8
|
|
%head = alloca ptr, align 8
|
|
%reterr = alloca i64, align 8
|
|
store ptr %1, ptr %doc, align 8
|
|
%2 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
|
|
%3 = load ptr, ptr %2, align 8
|
|
%not = icmp eq ptr %3, null
|
|
br i1 %not, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %entry
|
|
ret i64 ptrtoint (ptr @"test.TitleResult$TITLE_MISSING" to i64)
|
|
|
|
if.exit: ; preds = %entry
|
|
%4 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
|
|
%5 = load ptr, ptr %4, align 8
|
|
%6 = getelementptr inbounds %Head, ptr %5, i32 0, i32 0
|
|
%7 = load ptr, ptr %6, align 8
|
|
store ptr %7, ptr %head, align 8
|
|
%8 = load ptr, ptr %head, align 8
|
|
%not1 = icmp eq ptr %8, null
|
|
br i1 %not1, label %if.then2, label %if.exit3
|
|
|
|
if.then2: ; preds = %if.exit
|
|
ret i64 ptrtoint (ptr @"test.TitleResult$TITLE_MISSING" to i64)
|
|
|
|
if.exit3: ; preds = %if.exit
|
|
%9 = load ptr, ptr %head, align 8
|
|
%10 = getelementptr inbounds %"char[]", ptr %9, i32 0, i32 1
|
|
%11 = load i64, ptr %10, align 8
|
|
%lt = icmp ult i64 0, %11
|
|
%12 = zext i1 %lt to i8
|
|
store i8 %12, ptr %0, align 1
|
|
ret i64 0
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i64 @test.readWhetherTitleNonEmpty(ptr %0, ptr %1, i64 %2) #0 {
|
|
entry:
|
|
%url = alloca %"char[]", align 8
|
|
%reterr = alloca i64, align 8
|
|
%retparam = alloca i8, align 1
|
|
%retparam1 = alloca %Doc, align 8
|
|
store ptr %1, ptr %url, align 8
|
|
%ptroffset = getelementptr inbounds i64, ptr %url, i64 1
|
|
store i64 %2, ptr %ptroffset, align 8
|
|
%3 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo = load ptr, ptr %3, align 8
|
|
%4 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi = load i64, ptr %4, align 8
|
|
%5 = call i64 @test.readDoc(ptr %retparam1, ptr %lo, i64 %hi)
|
|
%not_err = icmp eq i64 %5, 0
|
|
%6 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %6, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %5, ptr %reterr, align 8
|
|
br label %err_retblock
|
|
|
|
after_check: ; preds = %entry
|
|
%7 = load ptr, ptr %retparam1, align 8
|
|
%8 = call i64 @test.isTitleNonEmpty(ptr %retparam, ptr %7)
|
|
%not_err2 = icmp eq i64 %8, 0
|
|
%9 = call i1 @llvm.expect.i1(i1 %not_err2, i1 true)
|
|
br i1 %9, label %after_check4, label %assign_optional3
|
|
|
|
assign_optional3: ; preds = %after_check
|
|
store i64 %8, ptr %reterr, align 8
|
|
br label %err_retblock
|
|
|
|
after_check4: ; preds = %after_check
|
|
%10 = load i8, ptr %retparam, align 1
|
|
store i8 %10, ptr %0, align 1
|
|
ret i64 0
|
|
|
|
err_retblock: ; preds = %assign_optional3, %assign_optional
|
|
%11 = load i64, ptr %reterr, align 8
|
|
ret i64 %11
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define ptr @test.bool_to_string(i8 zeroext %0) #0 {
|
|
entry:
|
|
%1 = trunc i8 %0 to i1
|
|
%ternary = select i1 %1, %"char[]" { ptr @.str.23, i64 4 }, %"char[]" { ptr @.str.24, i64 5 }
|
|
%2 = extractvalue %"char[]" %ternary, 0
|
|
ret ptr %2
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define ptr @test.nameFromError(i64 %0) #0 {
|
|
entry:
|
|
%switch = alloca i64, align 8
|
|
store i64 %0, ptr %switch, align 8
|
|
br label %switch.entry
|
|
|
|
switch.entry: ; preds = %entry
|
|
%1 = load i64, ptr %switch, align 8
|
|
%eq = icmp eq i64 ptrtoint (ptr @"test.TitleResult$TITLE_MISSING" to i64), %1
|
|
br i1 %eq, label %switch.case, label %next_if
|
|
|
|
switch.case: ; preds = %switch.entry
|
|
ret ptr @.str.25
|
|
|
|
next_if: ; preds = %switch.entry
|
|
%eq1 = icmp eq i64 ptrtoint (ptr @"test.ReadError$BAD_READ" to i64), %1
|
|
br i1 %eq1, label %switch.case2, label %next_if3
|
|
|
|
switch.case2: ; preds = %next_if
|
|
ret ptr @.str.26
|
|
|
|
next_if3: ; preds = %next_if
|
|
%eq4 = icmp eq i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), %1
|
|
br i1 %eq4, label %switch.case5, label %next_if6
|
|
|
|
switch.case5: ; preds = %next_if3
|
|
ret ptr @.str.27
|
|
|
|
next_if6: ; preds = %next_if3
|
|
br label %switch.default
|
|
|
|
switch.default: ; preds = %next_if6
|
|
ret ptr @.str.28
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define void @test.main() #0 {
|
|
entry:
|
|
%URLS = alloca %"char[][]", align 8
|
|
%literal = alloca [5 x %"char[]"], align 16
|
|
%.anon = alloca i64, align 8
|
|
%.anon1 = alloca i64, align 8
|
|
%url = alloca %"char[]", align 8
|
|
%summary = alloca %Summary, align 8
|
|
%result = alloca %Summary, align 8
|
|
%title_sure = alloca %"char[]", align 8
|
|
%has_title = alloca i8, align 1
|
|
%has_title.f = alloca i64, align 8
|
|
%retparam = alloca i8, align 1
|
|
%0 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 0
|
|
store %"char[]" { ptr @.str.29, i64 4 }, ptr %0, align 8
|
|
%1 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 1
|
|
store %"char[]" { ptr @.str.30, i64 11 }, ptr %1, align 8
|
|
%2 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 2
|
|
store %"char[]" { ptr @.str.31, i64 13 }, ptr %2, align 8
|
|
%3 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 3
|
|
store %"char[]" { ptr @.str.32, i64 12 }, ptr %3, align 8
|
|
%4 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 4
|
|
store %"char[]" { ptr @.str.33, i64 4 }, ptr %4, align 8
|
|
%5 = insertvalue %"char[][]" undef, ptr %literal, 0
|
|
%6 = insertvalue %"char[][]" %5, i64 5, 1
|
|
store %"char[][]" %6, ptr %URLS, align 8
|
|
%7 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 1
|
|
%8 = load i64, ptr %7, align 8
|
|
store i64 %8, ptr %.anon, align 8
|
|
store i64 0, ptr %.anon1, align 8
|
|
br label %loop.cond
|
|
|
|
loop.cond: ; preds = %phi_block12, %entry
|
|
%9 = load i64, ptr %.anon1, align 8
|
|
%10 = load i64, ptr %.anon, align 8
|
|
%lt = icmp ult i64 %9, %10
|
|
br i1 %lt, label %loop.body, label %loop.exit
|
|
|
|
loop.body: ; preds = %loop.cond
|
|
%11 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 0
|
|
%12 = load ptr, ptr %11, align 8
|
|
%13 = load i64, ptr %.anon1, align 8
|
|
%ptroffset = getelementptr inbounds %"char[]", ptr %12, i64 %13
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %url, ptr align 8 %ptroffset, i32 16, i1 false)
|
|
%14 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%15 = load i64, ptr %14, align 8
|
|
%trunc = trunc i64 %15 to i32
|
|
%16 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%17 = load ptr, ptr %16, align 8
|
|
%18 = call i32 (ptr, ...) @printf(ptr @.str.34, i32 %trunc, ptr %17)
|
|
%19 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo = load ptr, ptr %19, align 8
|
|
%20 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi = load i64, ptr %20, align 8
|
|
%21 = call { ptr, i8 } @test.readAndBuildSummary(ptr %lo, i64 %hi)
|
|
store { ptr, i8 } %21, ptr %result, align 8
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %summary, ptr align 8 %result, i32 16, i1 false)
|
|
%22 = call i32 (ptr, ...) @printf(ptr @.str.35)
|
|
%23 = load ptr, ptr @__stdoutp, align 8
|
|
call void @test.Summary.print(ptr %summary, ptr %23)
|
|
%24 = call i32 (ptr, ...) @printf(ptr @.str.36)
|
|
%25 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0
|
|
%26 = load ptr, ptr %25, align 8
|
|
%ptrbool = icmp ne ptr %26, null
|
|
br i1 %ptrbool, label %cond.lhs, label %cond.rhs
|
|
|
|
cond.lhs: ; preds = %loop.body
|
|
%27 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0
|
|
%28 = load ptr, ptr %27, align 8
|
|
%29 = load %"char[]", ptr %28, align 8
|
|
br label %cond.phi
|
|
|
|
cond.rhs: ; preds = %loop.body
|
|
br label %cond.phi
|
|
|
|
cond.phi: ; preds = %cond.rhs, %cond.lhs
|
|
%val = phi %"char[]" [ %29, %cond.lhs ], [ zeroinitializer, %cond.rhs ]
|
|
store %"char[]" %val, ptr %title_sure, align 8
|
|
%30 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 1
|
|
%31 = load i64, ptr %30, align 8
|
|
%trunc2 = trunc i64 %31 to i32
|
|
%32 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 0
|
|
%33 = load ptr, ptr %32, align 8
|
|
%34 = call i32 (ptr, ...) @printf(ptr @.str.37, i32 %trunc2, ptr %33)
|
|
%35 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
|
|
%lo3 = load ptr, ptr %35, align 8
|
|
%36 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
|
|
%hi4 = load i64, ptr %36, align 8
|
|
%37 = call i64 @test.readWhetherTitleNonEmpty(ptr %retparam, ptr %lo3, i64 %hi4)
|
|
%not_err = icmp eq i64 %37, 0
|
|
%38 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %38, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %cond.phi
|
|
store i64 %37, ptr %has_title.f, align 8
|
|
br label %after_assign
|
|
|
|
after_check: ; preds = %cond.phi
|
|
%39 = load i8, ptr %retparam, align 1
|
|
store i8 %39, ptr %has_title, align 1
|
|
store i64 0, ptr %has_title.f, align 8
|
|
br label %after_assign
|
|
|
|
after_assign: ; preds = %after_check, %assign_optional
|
|
%optval = load i64, ptr %has_title.f, align 8
|
|
%not_err5 = icmp eq i64 %optval, 0
|
|
%40 = call i1 @llvm.expect.i1(i1 %not_err5, i1 true)
|
|
br i1 %40, label %after_check6, label %else_block
|
|
|
|
after_check6: ; preds = %after_assign
|
|
%41 = load i8, ptr %has_title, align 1
|
|
%42 = call ptr @test.bool_to_string(i8 zeroext %41)
|
|
br label %phi_block
|
|
|
|
else_block: ; preds = %after_assign
|
|
%43 = load i64, ptr %has_title.f, align 8
|
|
%44 = call ptr @test.nameFromError(i64 %43)
|
|
br label %phi_block
|
|
|
|
phi_block: ; preds = %else_block, %after_check6
|
|
%val7 = phi ptr [ %42, %after_check6 ], [ %44, %else_block ]
|
|
%optval8 = load i64, ptr %has_title.f, align 8
|
|
%not_err9 = icmp eq i64 %optval8, 0
|
|
%45 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
|
|
br i1 %45, label %after_check10, label %else_block11
|
|
|
|
after_check10: ; preds = %phi_block
|
|
%46 = load i8, ptr %has_title, align 1
|
|
%47 = trunc i8 %46 to i1
|
|
br label %phi_block12
|
|
|
|
else_block11: ; preds = %phi_block
|
|
br label %phi_block12
|
|
|
|
phi_block12: ; preds = %else_block11, %after_check10
|
|
%val13 = phi i1 [ %47, %after_check10 ], [ false, %else_block11 ]
|
|
%ternary = select i1 %val13, ptr @.str.39, ptr @.str.40
|
|
%48 = call i32 (ptr, ...) @printf(ptr @.str.38, ptr %val7, ptr %ternary)
|
|
%49 = load i64, ptr %.anon1, align 8
|
|
%add = add i64 %49, 1
|
|
store i64 %add, ptr %.anon1, align 8
|
|
br label %loop.cond
|
|
|
|
loop.exit: ; preds = %loop.cond
|
|
ret void
|
|
}
|