Compare commits
643 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f607cd8bad | ||
|
|
5b0965dc53 | ||
|
|
0db78100cd | ||
|
|
2196f2259f | ||
|
|
55814cbda4 | ||
|
|
6fb48023f2 | ||
|
|
76c1800a53 | ||
|
|
3b2f01e974 | ||
|
|
db141e1f3f | ||
|
|
8ca8824165 | ||
|
|
2e49161415 | ||
|
|
e5f38a6fc1 | ||
|
|
8c105d87c1 | ||
|
|
8c2946a41b | ||
|
|
4f21915f35 | ||
|
|
585bdb549f | ||
|
|
8091c9e737 | ||
|
|
fc504e18d2 | ||
|
|
90c76bb992 | ||
|
|
3da1aa3ec6 | ||
|
|
0a0d72e016 | ||
|
|
550889808a | ||
|
|
1c1da6433a | ||
|
|
963d7958ea | ||
|
|
7031247614 | ||
|
|
07738e13ef | ||
|
|
3ab96aa1ee | ||
|
|
bdd3f6ed44 | ||
|
|
3328847e27 | ||
|
|
4a6f072361 | ||
|
|
5bbcdd121a | ||
|
|
8e89dc8aa9 | ||
|
|
c458b726b4 | ||
|
|
c0a156f347 | ||
|
|
8e12cd6b02 | ||
|
|
a6f92b8ff9 | ||
|
|
cdb1cf1b63 | ||
|
|
877b397e04 | ||
|
|
df13e3ab82 | ||
|
|
8536fe4987 | ||
|
|
eba08334d1 | ||
|
|
165a99fd83 | ||
|
|
6754a9f3da | ||
|
|
12b0d81dda | ||
|
|
95da7c1c87 | ||
|
|
c903785864 | ||
|
|
eae94c5f23 | ||
|
|
ddabfdca3d | ||
|
|
5cf6a30027 | ||
|
|
91c9b4e168 | ||
|
|
914a0c60b0 | ||
|
|
773fb7c75b | ||
|
|
afe20ffe92 | ||
|
|
0b72c0b25c | ||
|
|
f06899303c | ||
|
|
b121d1730b | ||
|
|
5d570b5140 | ||
|
|
980a537930 | ||
|
|
d700c78f6c | ||
|
|
c7abc03fee | ||
|
|
9f243563b9 | ||
|
|
5eac8d860a | ||
|
|
1c8f860b6e | ||
|
|
1226308f3d | ||
|
|
40dd25c122 | ||
|
|
fa71885cf9 | ||
|
|
2a7be0eabb | ||
|
|
ab7c828cfa | ||
|
|
e6f8cfb16c | ||
|
|
0283a42273 | ||
|
|
d1a6d29fdd | ||
|
|
ee15aa888f | ||
|
|
3cc975813d | ||
|
|
f226177bca | ||
|
|
995478adac | ||
|
|
62915d5af5 | ||
|
|
825e2eec51 | ||
|
|
b7f2bae2ef | ||
|
|
9b4701fed7 | ||
|
|
937e55eb46 | ||
|
|
7c003e9e7a | ||
|
|
f0f973eb00 | ||
|
|
f399dd3498 | ||
|
|
d2e5bb99ef | ||
|
|
77eeea95c7 | ||
|
|
056ad51c24 | ||
|
|
97e38255c6 | ||
|
|
88004cac76 | ||
|
|
1162a5f916 | ||
|
|
418c37dd52 | ||
|
|
b66827998d | ||
|
|
b195656900 | ||
|
|
2628ee98f3 | ||
|
|
176c0b2d36 | ||
|
|
4986592dd7 | ||
|
|
a4c4324ba3 | ||
|
|
6442ab2f20 | ||
|
|
c19786bdfb | ||
|
|
1b498128ef | ||
|
|
556939139b | ||
|
|
d5dfd37385 | ||
|
|
508b4d648d | ||
|
|
163813145d | ||
|
|
5baa1aaa2a | ||
|
|
59b7d5a9f4 | ||
|
|
bbd1187a9c | ||
|
|
3f65ae39af | ||
|
|
8bac9853fa | ||
|
|
301a6736ac | ||
|
|
55ee21421e | ||
|
|
1a4ca389cd | ||
|
|
27cfeefef1 | ||
|
|
cc357b2b7d | ||
|
|
6335ac6a47 | ||
|
|
e61ebb4eb9 | ||
|
|
a6b8edde62 | ||
|
|
a4450db277 | ||
|
|
b7e38e95f0 | ||
|
|
cda572fd59 | ||
|
|
af4a0ffa21 | ||
|
|
f786c86f77 | ||
|
|
55365b1d17 | ||
|
|
d605c850b7 | ||
|
|
5bb33ce420 | ||
|
|
39268c681f | ||
|
|
a2b82c18d7 | ||
|
|
83a9ab44bd | ||
|
|
3bf3a276de | ||
|
|
9a7fbaee00 | ||
|
|
6ed01f24be | ||
|
|
04428c5aed | ||
|
|
ba8e48be38 | ||
|
|
bc2613c42b | ||
|
|
ac71a45b3b | ||
|
|
30425a194e | ||
|
|
63e678928b | ||
|
|
e32896137e | ||
|
|
0787909045 | ||
|
|
1acfb53c4c | ||
|
|
46c7e53ca1 | ||
|
|
7228709616 | ||
|
|
2ca5d39f7d | ||
|
|
08583463be | ||
|
|
84d3f6ac9c | ||
|
|
0f8fc7bdee | ||
|
|
cc0ae5e229 | ||
|
|
5750447826 | ||
|
|
908f0047f8 | ||
|
|
e533903cee | ||
|
|
1be8052caa | ||
|
|
668ce4bd2d | ||
|
|
e7fd038493 | ||
|
|
03edb3bbbe | ||
|
|
307a1a295a | ||
|
|
446df58e92 | ||
|
|
1ad5caba93 | ||
|
|
9eddc0e4f0 | ||
|
|
087ba0d81d | ||
|
|
3c5cd8f38f | ||
|
|
367743530f | ||
|
|
7370ce2793 | ||
|
|
ba61b42ef5 | ||
|
|
f7e362dd90 | ||
|
|
66da072fd7 | ||
|
|
d763534208 | ||
|
|
ad05898543 | ||
|
|
f930f7878d | ||
|
|
d6a75c411b | ||
|
|
568a71e0dc | ||
|
|
c92e9aac2c | ||
|
|
3012c4a3ff | ||
|
|
ebe338ac9a | ||
|
|
a45523a48c | ||
|
|
5bfeea67d7 | ||
|
|
f35f15d36c | ||
|
|
057af792df | ||
|
|
41a850e7b2 | ||
|
|
6be70390a6 | ||
|
|
1cfe3ee9f8 | ||
|
|
c1927c985a | ||
|
|
309f42994b | ||
|
|
feb28ecace | ||
|
|
00f74b7f0a | ||
|
|
fcc0e1776b | ||
|
|
a5ec755c28 | ||
|
|
98945926ca | ||
|
|
d3e3767df4 | ||
|
|
de1281bb66 | ||
|
|
07e55c3d89 | ||
|
|
6e4ebeddf4 | ||
|
|
2b9fb88bf0 | ||
|
|
022965b9c7 | ||
|
|
6278718a24 | ||
|
|
1675daafcd | ||
|
|
ed5b6edf52 | ||
|
|
638caa355c | ||
|
|
78b2f9b455 | ||
|
|
2a35ffcc27 | ||
|
|
5eae8f9af6 | ||
|
|
25381e20d2 | ||
|
|
fc35ff5cd1 | ||
|
|
b10d00b426 | ||
|
|
c634dc25b4 | ||
|
|
2fb4561bf8 | ||
|
|
f167c6dcca | ||
|
|
555ace9e2e | ||
|
|
d07ffb36ad | ||
|
|
9e2b8b77c9 | ||
|
|
29e4af4fb2 | ||
|
|
91513a12b4 | ||
|
|
ee3f55dd41 | ||
|
|
c2e5a78076 | ||
|
|
da3ac3e93d | ||
|
|
278ebbc9bd | ||
|
|
546f93147e | ||
|
|
3e7bfbb45c | ||
|
|
c2cf0443ef | ||
|
|
59d68c6438 | ||
|
|
e0ee199bf1 | ||
|
|
c1bf895674 | ||
|
|
ea4d92e671 | ||
|
|
e3f56105d4 | ||
|
|
c447a87605 | ||
|
|
584e5b1f01 | ||
|
|
207dc4c112 | ||
|
|
6a3581f7a3 | ||
|
|
11e74975b3 | ||
|
|
75ef9ec524 | ||
|
|
9b742e777b | ||
|
|
5d93565e16 | ||
|
|
cebfe5c95b | ||
|
|
7881f3a53b | ||
|
|
56269bd52b | ||
|
|
68c43a2cc9 | ||
|
|
120b507c75 | ||
|
|
44fe7e8dc4 | ||
|
|
75d679f141 | ||
|
|
e9570f2400 | ||
|
|
5b8567310c | ||
|
|
f882221db3 | ||
|
|
8c4d7bd641 | ||
|
|
6a78695fde | ||
|
|
73ad16dedd | ||
|
|
dd98112c5a | ||
|
|
47521d3579 | ||
|
|
0c31300578 | ||
|
|
6340ff7da0 | ||
|
|
b66cb49d80 | ||
|
|
c884184220 | ||
|
|
091fee61e0 | ||
|
|
172a268e77 | ||
|
|
924715fe34 | ||
|
|
35a73b4cde | ||
|
|
238f9593f9 | ||
|
|
9e8b5703dc | ||
|
|
d8bd8be57e | ||
|
|
a4d4e8b3a9 | ||
|
|
703dd17e33 | ||
|
|
bc654a462e | ||
|
|
11535825c0 | ||
|
|
196df40c99 | ||
|
|
7aee6c3a15 | ||
|
|
372b566d23 | ||
|
|
9550354442 | ||
|
|
95c3ddfc39 | ||
|
|
bf4f2b6fa0 | ||
|
|
d3f75a92ad | ||
|
|
369495c8d3 | ||
|
|
dd52f71069 | ||
|
|
af8e2bc19d | ||
|
|
947e5591ea | ||
|
|
521376e8e8 | ||
|
|
55c0adb23d | ||
|
|
b20ad7047f | ||
|
|
fa3149c660 | ||
|
|
1463ed4835 | ||
|
|
b959de18d5 | ||
|
|
edac3f73c2 | ||
|
|
388b19eed5 | ||
|
|
a337136389 | ||
|
|
31d5a8ac10 | ||
|
|
46527f56ce | ||
|
|
a575c17eca | ||
|
|
a6ea3b1e6f | ||
|
|
4d2ad842a4 | ||
|
|
ce0f5f3797 | ||
|
|
9e0d22ac90 | ||
|
|
ddc2c56115 | ||
|
|
acfbe6902a | ||
|
|
f7dfab481b | ||
|
|
23692430d5 | ||
|
|
03fe594339 | ||
|
|
45babef689 | ||
|
|
9ac0450255 | ||
|
|
b1d55f657d | ||
|
|
aac5e7b3cd | ||
|
|
791634c377 | ||
|
|
090149eab6 | ||
|
|
acecbf587d | ||
|
|
4ef46971d0 | ||
|
|
2e3cc49782 | ||
|
|
8a0189b079 | ||
|
|
0edd7f6df0 | ||
|
|
0b058bc2e8 | ||
|
|
f9ef9cab81 | ||
|
|
fbb2150d88 | ||
|
|
0912f1f509 | ||
|
|
64c13fa9ae | ||
|
|
2a5f9d9641 | ||
|
|
6c32fe87e6 | ||
|
|
09e9cc99d3 | ||
|
|
94a7ee024a | ||
|
|
a2d7a8c978 | ||
|
|
15499ddc14 | ||
|
|
97cb312386 | ||
|
|
92827a1f04 | ||
|
|
00222c7808 | ||
|
|
427d87be68 | ||
|
|
2560a333b6 | ||
|
|
c6b76db789 | ||
|
|
1414853fce | ||
|
|
cbe384a3be | ||
|
|
cca46573ea | ||
|
|
2589c23998 | ||
|
|
29830865d9 | ||
|
|
35dbc7b0b5 | ||
|
|
cd266213ce | ||
|
|
875eadeb19 | ||
|
|
67896c63a7 | ||
|
|
c643f734e9 | ||
|
|
31d91f5e87 | ||
|
|
2a92f1bc55 | ||
|
|
d9db5528f5 | ||
|
|
22a4ffb78b | ||
|
|
1fb37c37fe | ||
|
|
aae663e5e5 | ||
|
|
e985eda857 | ||
|
|
c9cc7ad9f7 | ||
|
|
65f88cc64e | ||
|
|
374ff92444 | ||
|
|
6d56a60d2b | ||
|
|
75aea37ced | ||
|
|
b133f70b6b | ||
|
|
093af00bbe | ||
|
|
f1da2613be | ||
|
|
1800c52c04 | ||
|
|
329f65a1ad | ||
|
|
d4dd0c00ff | ||
|
|
d9a24f5ac2 | ||
|
|
a13d9a92bd | ||
|
|
2b70bb60a9 | ||
|
|
48737e361a | ||
|
|
8e9f019f82 | ||
|
|
f6a7815837 | ||
|
|
5016de56fe | ||
|
|
879e4a0061 | ||
|
|
6eaf21e5a6 | ||
|
|
b0b38c02b2 | ||
|
|
cd8e1f2080 | ||
|
|
6cc58c194f | ||
|
|
14cf646c47 | ||
|
|
d49197cbe9 | ||
|
|
1687faa438 | ||
|
|
f0e3e556cf | ||
|
|
c9e8709490 | ||
|
|
52dcfaa452 | ||
|
|
9b5a30896d | ||
|
|
4e1450bbb5 | ||
|
|
d478efe444 | ||
|
|
dacb662d99 | ||
|
|
f8cd76bd92 | ||
|
|
6392fd41c6 | ||
|
|
9d91152f01 | ||
|
|
13972c932b | ||
|
|
81ec9017fc | ||
|
|
79b11b9f51 | ||
|
|
d474a051fd | ||
|
|
073cac8530 | ||
|
|
bc3dca45e7 | ||
|
|
ff36c3dfae | ||
|
|
5a5d86ccc3 | ||
|
|
942b1f5159 | ||
|
|
c93fce87da | ||
|
|
1038b06510 | ||
|
|
f8de6022dc | ||
|
|
a8ead2543d | ||
|
|
db856c4391 | ||
|
|
68949c28c8 | ||
|
|
cf67795ff4 | ||
|
|
1136526e4c | ||
|
|
0edeb5cfd0 | ||
|
|
bc7412f6c9 | ||
|
|
025cff9494 | ||
|
|
445e7154e8 | ||
|
|
4eb7e4000b | ||
|
|
028c6cdf50 | ||
|
|
b08ae1dff3 | ||
|
|
37e7d66343 | ||
|
|
e6d06cc278 | ||
|
|
017fd150cd | ||
|
|
ea7e1de833 | ||
|
|
c2767be178 | ||
|
|
c60be43ac6 | ||
|
|
c373a5b505 | ||
|
|
da20aea408 | ||
|
|
973b5b90dc | ||
|
|
cffb5e9539 | ||
|
|
4b35586566 | ||
|
|
1e075d4830 | ||
|
|
c81b5b5df9 | ||
|
|
80b2b8d061 | ||
|
|
d1a7f63797 | ||
|
|
92359dd03b | ||
|
|
d1430c9f5a | ||
|
|
7feca4478e | ||
|
|
02b1d5ed84 | ||
|
|
99d74ce4b6 | ||
|
|
355094c7e2 | ||
|
|
7f61989869 | ||
|
|
7223ff004a | ||
|
|
df333fb144 | ||
|
|
5c08c55957 | ||
|
|
26b812a62a | ||
|
|
cd3d9c709f | ||
|
|
9da90e7ecf | ||
|
|
f17a4ca1de | ||
|
|
8ab662b373 | ||
|
|
fb839da81e | ||
|
|
244da4b10a | ||
|
|
c0c5271172 | ||
|
|
0066f8bd3f | ||
|
|
be9d209622 | ||
|
|
2bbd828f3a | ||
|
|
4f1b6e95a1 | ||
|
|
87ca3a39dc | ||
|
|
d7df46d578 | ||
|
|
489cbc4782 | ||
|
|
3c33a1d05e | ||
|
|
067cf0cba6 | ||
|
|
03a194a514 | ||
|
|
bdf45c0fcb | ||
|
|
6f679c05a3 | ||
|
|
0b131bd957 | ||
|
|
ebf4c80aff | ||
|
|
18a63e226a | ||
|
|
92f56a2f90 | ||
|
|
926e2d4a2e | ||
|
|
5d1d51dd58 | ||
|
|
52018cd424 | ||
|
|
e9153defee | ||
|
|
889fc8b6a9 | ||
|
|
9b9da3133d | ||
|
|
1c8edb0387 | ||
|
|
c0ef1598c9 | ||
|
|
bc1acee6f5 | ||
|
|
9f25d73826 | ||
|
|
f07a62d136 | ||
|
|
06d6b447e4 | ||
|
|
1cff02e4cc | ||
|
|
809a400f57 | ||
|
|
f1bb42f554 | ||
|
|
4fd8f84536 | ||
|
|
223c24450e | ||
|
|
8a7ddf4dc2 | ||
|
|
08217e5a5a | ||
|
|
424dbd9261 | ||
|
|
b615ada2c3 | ||
|
|
20a47873d0 | ||
|
|
d87ce1a124 | ||
|
|
91d012d33d | ||
|
|
330cb22351 | ||
|
|
236debab33 | ||
|
|
13a1c8ac4b | ||
|
|
29fad7b397 | ||
|
|
8eeac8a26d | ||
|
|
133d41d748 | ||
|
|
d444123062 | ||
|
|
4a5c8d3fbb | ||
|
|
afd3d40348 | ||
|
|
85da86a4f1 | ||
|
|
72d4f0f7f8 | ||
|
|
192b479f18 | ||
|
|
3e6dfa3c05 | ||
|
|
5bd28a1e9e | ||
|
|
a23a2601e4 | ||
|
|
3220b629c7 | ||
|
|
9cf122c31a | ||
|
|
75d513a78a | ||
|
|
3cbe4aac87 | ||
|
|
3e47a977e4 | ||
|
|
40855c2d2a | ||
|
|
b2319eda66 | ||
|
|
5c5b8e62e5 | ||
|
|
fbb1f89ab3 | ||
|
|
25b104cf13 | ||
|
|
be1599b418 | ||
|
|
d462e548b1 | ||
|
|
df1e4708f5 | ||
|
|
cf02f4a34f | ||
|
|
480cf09177 | ||
|
|
52a64a7770 | ||
|
|
8d3cb246c2 | ||
|
|
8f15fd45f2 | ||
|
|
afd02b3d78 | ||
|
|
aa1d0b307b | ||
|
|
8a09d8b442 | ||
|
|
7b99470bfa | ||
|
|
30192da7cf | ||
|
|
66337e0975 | ||
|
|
6e4a44438b | ||
|
|
3cc3b864af | ||
|
|
62f6542ca9 | ||
|
|
8c25848e1b | ||
|
|
e112d8277f | ||
|
|
014d0262da | ||
|
|
8ae97f73d0 | ||
|
|
666808b427 | ||
|
|
f208db48a1 | ||
|
|
673b9d9a5c | ||
|
|
ed8ffb228b | ||
|
|
d5a3ff6fb9 | ||
|
|
d3fddfb634 | ||
|
|
f7a54e3377 | ||
|
|
d62bf858dd | ||
|
|
ae0906d322 | ||
|
|
c6cb2931e1 | ||
|
|
0eac576171 | ||
|
|
0ee96db260 | ||
|
|
40a9e00d4c | ||
|
|
d8615330ad | ||
|
|
02afd1d73a | ||
|
|
4eedb4fb69 | ||
|
|
2d6869bdbd | ||
|
|
c0a9848cfb | ||
|
|
40cc7b2a85 | ||
|
|
dfaae24fea | ||
|
|
839ad8ba2b | ||
|
|
e757c66354 | ||
|
|
3ec6da002a | ||
|
|
190b029154 | ||
|
|
0bfc269652 | ||
|
|
b5961f0807 | ||
|
|
a792e312db | ||
|
|
04f81f3dbb | ||
|
|
91401c4571 | ||
|
|
18fe26e853 | ||
|
|
f895ca1fe6 | ||
|
|
ad28ed3154 | ||
|
|
f64abf37ab | ||
|
|
acc5de8d14 | ||
|
|
85bb1302ca | ||
|
|
fc893ba498 | ||
|
|
7527b326d7 | ||
|
|
a6d31ad8b8 | ||
|
|
664c3fcce3 | ||
|
|
e1d1d6a2d9 | ||
|
|
8c1b8ad945 | ||
|
|
ae5efdf16c | ||
|
|
2b82af519c | ||
|
|
7a347d4563 | ||
|
|
1610894a80 | ||
|
|
4eb2ddaf15 | ||
|
|
99a86d8d4e | ||
|
|
637db665c3 | ||
|
|
bb1da81a01 | ||
|
|
d4ddc61a9f | ||
|
|
6ebbc92c4f | ||
|
|
b45172bef1 | ||
|
|
695d3f3327 | ||
|
|
7979cfcb06 | ||
|
|
2986cb0c5f | ||
|
|
5a175955a9 | ||
|
|
cb507f43a7 | ||
|
|
8b148d72c2 | ||
|
|
616596e571 | ||
|
|
2849fe4841 | ||
|
|
98065e80d0 | ||
|
|
286b520d83 | ||
|
|
769b93a277 | ||
|
|
c30ed1b3c8 | ||
|
|
78d7f984d1 | ||
|
|
e88f7e6659 | ||
|
|
e8ff879943 | ||
|
|
f09d5bd155 | ||
|
|
53e73fc622 | ||
|
|
ba94d6f04e | ||
|
|
449f91ab14 | ||
|
|
70623dd554 | ||
|
|
35dc6dcd85 | ||
|
|
41dfafe957 | ||
|
|
2cc1bdee19 | ||
|
|
eb4146d80d | ||
|
|
0d68066086 | ||
|
|
7039cb3bc2 | ||
|
|
510f2f4769 | ||
|
|
5415f68c1b | ||
|
|
475f0fa2ff | ||
|
|
c58b1140d8 | ||
|
|
c97c1e97b9 | ||
|
|
ba3d82e5e5 | ||
|
|
d432899b42 | ||
|
|
08da38a609 | ||
|
|
6a3eb2f2f9 | ||
|
|
6a02c3ac4c | ||
|
|
f1761c0c9c | ||
|
|
39076c75cf | ||
|
|
3be8cacc24 | ||
|
|
46a9df47e4 | ||
|
|
d44a31cc62 | ||
|
|
00b2fd1479 | ||
|
|
5f08e7a612 | ||
|
|
5c8725373a | ||
|
|
c455f6e730 | ||
|
|
3cc83b8ec4 | ||
|
|
f74de76d70 | ||
|
|
ea8ddc6451 | ||
|
|
5f36c37cf2 | ||
|
|
2ad2873278 | ||
|
|
3855895808 | ||
|
|
f86cd74a98 | ||
|
|
1e6ecbadcd | ||
|
|
33716a3385 | ||
|
|
252f0bf967 | ||
|
|
2c3e1d1055 | ||
|
|
aafa639bf1 | ||
|
|
815a8a74fc | ||
|
|
840ea80e20 | ||
|
|
773ae2c8c6 | ||
|
|
4aadb4b86f | ||
|
|
91d1d71f6d | ||
|
|
a3d6a94600 | ||
|
|
43ae7a23b2 | ||
|
|
b6005886fa | ||
|
|
28dd34a136 | ||
|
|
3a3c263203 | ||
|
|
87b7ecd1d6 | ||
|
|
f5a309b5ad | ||
|
|
0f00add402 | ||
|
|
1014fa53dd | ||
|
|
04568835bd | ||
|
|
e4f8edc07c | ||
|
|
a8533d1677 | ||
|
|
edcb66afb7 |
8
.github/workflows/go.yml
vendored
8
.github/workflows/go.yml
vendored
@@ -60,4 +60,10 @@ jobs:
|
||||
run: go build -v ./...
|
||||
|
||||
- name: Test
|
||||
run: go test -v ./...
|
||||
run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...
|
||||
|
||||
- name: Upload coverage reports to Codecov
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
slug: goplus/llgo
|
||||
|
||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -8,7 +8,18 @@
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
test.db
|
||||
llgo_autogen.ll
|
||||
stories*.bin
|
||||
.DS_Store
|
||||
err.log
|
||||
numpy.txt
|
||||
|
||||
_go/
|
||||
_runtime/
|
||||
_tinygo/
|
||||
build.dir/
|
||||
.vscode/
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "c/llama2/llama2.c"]
|
||||
path = c/llama2/llama2.c
|
||||
url = https://github.com/karpathy/llama2.c.git
|
||||
244
README.md
244
README.md
@@ -4,7 +4,245 @@ llgo - A Go compiler based on LLVM
|
||||
[](https://github.com/goplus/llgo/actions/workflows/go.yml)
|
||||
[](https://goreportcard.com/report/github.com/goplus/llgo)
|
||||
[](https://github.com/goplus/llgo/releases)
|
||||
[](https://pkg.go.dev/github.com/goplus/llgo)
|
||||
<!--
|
||||
[](https://codecov.io/gh/goplus/llgo)
|
||||
-->
|
||||
[](https://pkg.go.dev/github.com/goplus/llgo)
|
||||
[](https://github.com/goplus/gop)
|
||||
|
||||
LLGo is a Go compiler based on LLVM in order to better integrate Go with the C ecosystem including Python. It's a subproject of [the Go+ project](https://github.com/goplus/gop).
|
||||
|
||||
|
||||
## C standard libary support
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "github.com/goplus/llgo/c"
|
||||
|
||||
func main() {
|
||||
c.Printf(c.Str("Hello world\n"))
|
||||
}
|
||||
```
|
||||
|
||||
This is a simple example of calling the C `printf` function to print `Hello world`. Here, `c.Str` is not a function for converting a Go string to a C string, but a built-in instruction supported by `llgo` for generating a C string constant.
|
||||
|
||||
The `_demo` directory contains some C standard libary related demos (it start with `_` to prevent the `go` command from compiling it):
|
||||
|
||||
* [hello](_demo/hello/hello.go): call C `printf` to print `Hello world`
|
||||
* [concat](_demo/concat/concat.go): call C `fprintf` with `stderr`
|
||||
* [qsort](_demo/qsort/qsort.go): call C function with a callback (eg. `qsort`)
|
||||
|
||||
To run these demos (If you haven't installed `llgo` yet, please refer to [How to install](#how-to-install)):
|
||||
|
||||
```sh
|
||||
export LLGOROOT=`pwd`
|
||||
cd <demo-directory> # eg. cd _demo/hello
|
||||
llgo run .
|
||||
```
|
||||
|
||||
See [github.com/goplus/llgo/c](https://pkg.go.dev/github.com/goplus/llgo/c) for more detials.
|
||||
|
||||
|
||||
## Python support
|
||||
|
||||
You can import a Python library in LLGo!
|
||||
|
||||
And you can import any Python library into `llgo` through a program called `llpyg` (see [Development tools](#development-tools)). The following libraries have been included in `llgo`:
|
||||
|
||||
* [builtins](https://pkg.go.dev/github.com/goplus/llgo/py/std)
|
||||
* [sys](https://pkg.go.dev/github.com/goplus/llgo/py/sys)
|
||||
* [os](https://pkg.go.dev/github.com/goplus/llgo/py/os)
|
||||
* [math](https://pkg.go.dev/github.com/goplus/llgo/py/math)
|
||||
* [json](https://pkg.go.dev/github.com/goplus/llgo/py/json)
|
||||
* [inspect](https://pkg.go.dev/github.com/goplus/llgo/py/inspect)
|
||||
* [statistics](https://pkg.go.dev/github.com/goplus/llgo/py/statistics)
|
||||
* [numpy](https://pkg.go.dev/github.com/goplus/llgo/py/numpy)
|
||||
* [pandas](https://pkg.go.dev/github.com/goplus/llgo/py/pandas)
|
||||
* [pytorch](https://pkg.go.dev/github.com/goplus/llgo/py/torch)
|
||||
* [matplotlib](https://pkg.go.dev/github.com/goplus/llgo/py/matplotlib)
|
||||
|
||||
Here is an example using the Python `math` library:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := math.Sqrt(py.Float(2))
|
||||
c.Printf(c.Str("sqrt(2) = %f\n"), x.Float64())
|
||||
}
|
||||
```
|
||||
|
||||
Here, We call `py.Float(2)` to create a Python number 2, and pass it to Python’s `math.sqrt` to get `x`. Then use `x.Float64()` to convert x to Go's `float64` type, and print the value through the C `printf` function.
|
||||
|
||||
Let's look at a slightly more complex example. For example, we use `numpy` to calculate:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/numpy"
|
||||
)
|
||||
|
||||
func main() {
|
||||
a := py.List(
|
||||
py.List(1.0, 2.0, 3.0),
|
||||
py.List(4.0, 5.0, 6.0),
|
||||
py.List(7.0, 8.0, 9.0),
|
||||
)
|
||||
b := py.List(
|
||||
py.List(9.0, 8.0, 7.0),
|
||||
py.List(6.0, 5.0, 4.0),
|
||||
py.List(3.0, 2.0, 1.0),
|
||||
)
|
||||
x := numpy.Add(a, b)
|
||||
c.Printf(c.Str("a+b = %s\n"), x.Str().CStr())
|
||||
}
|
||||
```
|
||||
|
||||
Here we define two 3x3 matrices a and b, add them to get x, and then print the result.
|
||||
|
||||
The `_pydemo` directory contains some python related demos:
|
||||
|
||||
* [callpy](_pydemo/callpy/callpy.go): call Python standard library function `math.sqrt`
|
||||
* [pi](_pydemo/pi/pi.go): print python constants `math.pi`
|
||||
* [statistics](_pydemo/statistics/statistics.go): define a python list and call `statistics.mean` to get the mean
|
||||
* [matrix](_pydemo/matrix/matrix.go): a basic `numpy` demo
|
||||
|
||||
To run these demos, you need to set the `LLGO_LIB_PYTHON` environment variable first.
|
||||
|
||||
If Python is in the search path for `clang` linking, then `LLGO_LIB_PYTHON` only needs to be set to the name of the Python library. For example:
|
||||
|
||||
```sh
|
||||
export LLGO_LIB_PYTHON=python3.12
|
||||
```
|
||||
|
||||
You can also specify the path to tell `llgo` where the Python library is located:
|
||||
|
||||
```sh
|
||||
export LLGO_LIB_PYTHON=/foo/bar/python3.12
|
||||
```
|
||||
|
||||
For example, `/opt/homebrew/Frameworks/Python.framework/Versions/3.12/libpython3.12.dylib` is a typical python library location under macOS. So we should set it like this:
|
||||
|
||||
```sh
|
||||
export LLGO_LIB_PYTHON=/opt/homebrew/Frameworks/Python.framework/Versions/3.12/python3.12
|
||||
```
|
||||
|
||||
Note that the file name must be written in a platform-independent format, using `python3.12` instead of `libpython3.12.dylib`.
|
||||
|
||||
Then you can run the demos:
|
||||
|
||||
```sh
|
||||
export LLGOROOT=`pwd`
|
||||
cd <demo-directory> # eg. cd _pydemo/callpy
|
||||
llgo run .
|
||||
```
|
||||
|
||||
See [github.com/goplus/llgo/py](https://pkg.go.dev/github.com/goplus/llgo/py) for more detials.
|
||||
|
||||
|
||||
## Other frequently used libraries
|
||||
|
||||
LLGo can easily import any libraries from the C ecosystem. Currently, this import process is still manual, but in the future, it will be automated similar to Python library imports.
|
||||
|
||||
The currently supported libraries include:
|
||||
|
||||
* [llama2.c](https://pkg.go.dev/github.com/goplus/llgo/c/llama2)
|
||||
* [cjson](https://pkg.go.dev/github.com/goplus/llgo/c/cjson)
|
||||
* [sqlite](https://pkg.go.dev/github.com/goplus/llgo/c/sqlite)
|
||||
|
||||
Here are some examples related to them:
|
||||
|
||||
* [llama2-c](_demo/llama2-c): inference Llama 2 (It's the first llgo AI example)
|
||||
* [mkjson](c/cjson/_demo/mkjson/mkjson.go): create a json object and print it
|
||||
* [sqlitedemo](c/sqlite/_demo/sqlitedemo/demo.go): a basic sqlite demo
|
||||
|
||||
|
||||
## Go syntax support
|
||||
|
||||
Common Go syntax is already supported. Except for the following, which needs to be improved:
|
||||
|
||||
* map (Very limited support)
|
||||
* panic (Limited support)
|
||||
* recover (Not supported yet)
|
||||
* defer (Not supported yet)
|
||||
* gc (Not supported yet)
|
||||
* chan (Not supported yet)
|
||||
* goroutine (Not supported yet)
|
||||
* generics (Not supported yet)
|
||||
|
||||
Here are some examples related to Go syntax:
|
||||
|
||||
* [concat](_demo/concat/concat.go): define a variadic function
|
||||
* [genints](_demo/genints/genints.go): various forms of closure usage (including C function, recv.method and anonymous function)
|
||||
* [errors](_demo/errors/errors.go): demo to implement error interface
|
||||
|
||||
|
||||
## Go packages support
|
||||
|
||||
Here are the Go packages that can be imported correctly:
|
||||
|
||||
* [unsafe](https://pkg.go.dev/unsafe)
|
||||
* [unicode](https://pkg.go.dev/unicode)
|
||||
* [unicode/utf8](https://pkg.go.dev/unicode/utf8)
|
||||
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
|
||||
|
||||
|
||||
## How to install
|
||||
|
||||
Follow these steps to generate the `llgo` command (its usage is the same as the `go` command):
|
||||
|
||||
### on macOS
|
||||
|
||||
```sh
|
||||
brew update # execute if needed
|
||||
brew install llvm@17
|
||||
go install -v ./...
|
||||
```
|
||||
|
||||
### on Linux
|
||||
|
||||
```sh
|
||||
echo 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-17 main' | sudo tee /etc/apt/sources.list.d/llvm.list
|
||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||
sudo apt-get update # execute if needed
|
||||
sudo apt-get install --no-install-recommends llvm-17-dev
|
||||
go install -v ./...
|
||||
```
|
||||
|
||||
### on Windows
|
||||
|
||||
TODO
|
||||
|
||||
|
||||
## Development tools
|
||||
|
||||
* [pydump](chore/_xtool/pydump): It's the first program compiled by `llgo` (NOT `go`) in a production environment. It outputs symbol information (functions, variables, and constants) from a Python library in JSON format, preparing for the generation of corresponding packages in `llgo`.
|
||||
* [pysigfetch](https://github.com/goplus/hdq/tree/main/chore/pysigfetch): It generates symbol information by extracting information from Python's documentation site. This tool is not part of the `llgo` project, but we depend on it.
|
||||
* [llpyg](chore/llpyg): It is used to automatically convert Python libraries into Go packages that `llgo` can import. It depends on `pydump` and `pysigfetch` to accomplish the task.
|
||||
* [llgen](chore/llgen): It is used to compile Go packages into LLVM IR files (*.ll).
|
||||
* [ssadump](chore/ssadump): It is a Go SSA builder and interpreter.
|
||||
|
||||
How do I generate these tools?
|
||||
|
||||
```sh
|
||||
go install -v ./... # compile all tools except pydump
|
||||
cd chore/_xtool
|
||||
llgo install ./... # compile pydump
|
||||
go install github.com/goplus/hdq/chore/pysigfetch@v0.8.1 # compile pysigfetch
|
||||
```
|
||||
|
||||
## Key modules
|
||||
|
||||
Below are the key modules for understanding the implementation principles of `llgo`:
|
||||
|
||||
* [llgo/ssa](https://pkg.go.dev/github.com/goplus/llgo/ssa): It generates LLVM IR files (LLVM SSA) using the semantics (interfaces) of Go SSA. Although `LLVM SSA` and `Go SSA` are both IR languages, they work at completely different levels. `LLVM SSA` is closer to machine code, which abstracts different instruction sets. While `Go SSA` is closer to a high-level language. We can think of it as the instruction set of the `Go computer`. `llgo/ssa` is not just limited to the `llgo` compiler. If we view it as the high-level expressive power of `LLVM`, you'll find it very useful. Prior to `llgo/ssa`, you had to operate `LLVM` using machine code semantics. But now, with the advanced SSA form (in the semantics of Go SSA), you can conveniently utilize `LLVM`.
|
||||
* [llgo/cl](https://pkg.go.dev/github.com/goplus/llgo/cl): It is the core of the llgo compiler. It converts a Go package into LLVM IR files. It depends on `llgo/ssa`.
|
||||
* [llgo/internal/build](https://pkg.go.dev/github.com/goplus/llgo/internal/build): It strings together the entire compilation process of `llgo`. It depends on `llgo/ssa` and `llgo/cl`.
|
||||
|
||||
21
_demo/concat/concat.go
Normal file
21
_demo/concat/concat.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
func concat(args ...string) (ret string) {
|
||||
for _, v := range args {
|
||||
ret += v
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
result := concat("Hello", " ", "World")
|
||||
c.Fprintf(c.Stderr, c.Str("Hi, %s\n"), c.AllocaCStr(result))
|
||||
}
|
||||
|
||||
/* Expected output (stderr):
|
||||
Hi, Hello World
|
||||
*/
|
||||
22
_demo/errors/errors.go
Normal file
22
_demo/errors/errors.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
// New returns an error that formats as the given text.
|
||||
// Each call to New returns a distinct error value even if the text is identical.
|
||||
func New(text string) error {
|
||||
return &errorString{text}
|
||||
}
|
||||
|
||||
// errorString is a trivial implementation of error.
|
||||
type errorString struct {
|
||||
s string
|
||||
}
|
||||
|
||||
func (e *errorString) Error() string {
|
||||
return e.s
|
||||
}
|
||||
|
||||
func main() {
|
||||
err := New("an error")
|
||||
println(err)
|
||||
println(err.Error())
|
||||
}
|
||||
63
_demo/genints/gen_ints.go
Normal file
63
_demo/genints/gen_ints.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
type generator struct {
|
||||
val c.Int
|
||||
}
|
||||
|
||||
func (g *generator) next() c.Int {
|
||||
g.val++
|
||||
return g.val
|
||||
}
|
||||
|
||||
func genInts(n int, gen func() c.Int) []c.Int {
|
||||
a := make([]c.Int, n)
|
||||
for i := range a {
|
||||
a[i] = gen()
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func main() {
|
||||
// generate 5 random integers
|
||||
for _, v := range genInts(5, c.Rand) {
|
||||
c.Printf(c.Str("%d\n"), v)
|
||||
}
|
||||
|
||||
// generate 5 integers, each is double of the previous one
|
||||
initVal := c.Int(1)
|
||||
ints := genInts(5, func() c.Int {
|
||||
initVal *= 2
|
||||
return initVal
|
||||
})
|
||||
for _, v := range ints {
|
||||
c.Printf(c.Str("%d\n"), v)
|
||||
}
|
||||
|
||||
// generate 5 integers, each is incremented by 1
|
||||
g := &generator{val: 1}
|
||||
for _, v := range genInts(5, g.next) {
|
||||
c.Printf(c.Str("%d\n"), v)
|
||||
}
|
||||
}
|
||||
|
||||
/* Posible output:
|
||||
16807
|
||||
282475249
|
||||
1622650073
|
||||
984943658
|
||||
1144108930
|
||||
2
|
||||
4
|
||||
8
|
||||
16
|
||||
32
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
*/
|
||||
13
_demo/hello/hello.go
Normal file
13
_demo/hello/hello.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c.Printf(c.Str("Hello world\n"))
|
||||
}
|
||||
|
||||
/* Expected output:
|
||||
Hello World
|
||||
*/
|
||||
9
_demo/interf/foo/foo.go
Normal file
9
_demo/interf/foo/foo.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package foo
|
||||
|
||||
func Bar() any {
|
||||
return struct{ V int }{1}
|
||||
}
|
||||
|
||||
func F() any {
|
||||
return struct{ v int }{1}
|
||||
}
|
||||
35
_demo/interf/interf.go
Normal file
35
_demo/interf/interf.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/_demo/interf/foo"
|
||||
)
|
||||
|
||||
func Foo() any {
|
||||
return struct{ v int }{1}
|
||||
}
|
||||
|
||||
func main() {
|
||||
v := Foo()
|
||||
if x, ok := v.(struct{ v int }); ok {
|
||||
println(x.v)
|
||||
} else {
|
||||
println("Foo: not ok")
|
||||
}
|
||||
bar := foo.Bar()
|
||||
if x, ok := bar.(struct{ V int }); ok {
|
||||
println(x.V)
|
||||
} else {
|
||||
println("Bar: not ok")
|
||||
}
|
||||
if x, ok := foo.F().(struct{ v int }); ok {
|
||||
println(x.v)
|
||||
} else {
|
||||
println("F: not ok")
|
||||
}
|
||||
}
|
||||
|
||||
/* Expected output:
|
||||
1
|
||||
1
|
||||
F: not ok
|
||||
*/
|
||||
137
_demo/llama2-c/README.md
Normal file
137
_demo/llama2-c/README.md
Normal file
@@ -0,0 +1,137 @@
|
||||
llama2 - Inference Llama 2 in LLGo
|
||||
=====
|
||||
|
||||
<p align="center">
|
||||
<img src="assets/llama_cute.jpg" width="300" height="300" alt="Cute Llama">
|
||||
</p>
|
||||
|
||||
Have you ever wanted to inference a baby [Llama 2](https://ai.meta.com/llama/) model in Go? No? Well, now you can!
|
||||
|
||||
This is based on [llama2.c](https://github.com/karpathy/llama2.c), we didn't port anything! So it's very different from these Go implementations:
|
||||
* https://github.com/nikolaydubina/llama2.go
|
||||
* https://github.com/tmc/go-llama2
|
||||
|
||||
llgo plays a great role as a bridge, allowing the C ecosystem to be seamlessly connected to Go.
|
||||
|
||||
You might think that you need many billion parameter LLMs to do anything useful, but in fact very small LLMs can have surprisingly strong performance if you make the domain narrow enough (ref: [TinyStories](https://huggingface.co/datasets/roneneldan/TinyStories) paper). This repo is a "fullstack" train + inference solution for Llama 2 LLM, with focus on minimalism and simplicity.
|
||||
|
||||
As the architecture is identical, you can also load and inference Meta's Llama 2 models. However, the current code only inferences models in fp32, so you will most likely not be able to productively load models larger than 7B.
|
||||
|
||||
## feel the magic
|
||||
|
||||
How to run this example? The simplest way is to run it without any arguments:
|
||||
|
||||
```bash
|
||||
llgo run .
|
||||
```
|
||||
|
||||
This means it uses the default model checkpoint file (`stories15M.bin`), and the default prompt (`Once upon a time`).
|
||||
|
||||
You need download the model checkpoint file first. Download this 15M parameter model trained on the [TinyStories](https://huggingface.co/datasets/roneneldan/TinyStories) dataset (~60MB download):
|
||||
|
||||
```bash
|
||||
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
|
||||
```
|
||||
|
||||
If you want to specify a prompt (eg. `Long long ago`):
|
||||
|
||||
```bash
|
||||
llgo run . 'Long long ago'
|
||||
```
|
||||
|
||||
We can also try a bit bigger 42M parameter model (ie. `stories42M.bin`):
|
||||
|
||||
```bash
|
||||
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories42M.bin
|
||||
llgo run . -m stories42M.bin 'Long long ago'
|
||||
```
|
||||
|
||||
There is also an even better 110M param model available, see [models](#models).
|
||||
|
||||
Quick note on sampling, the recommendation for ~best results is to sample with `-t 1.0 -p 0.9`, i.e. temperature 1.0 (default) but also top-p sampling at 0.9 (default). Intuitively, top-p ensures that tokens with tiny probabilities do not get sampled, so we can't get "unlucky" during sampling, and we are less likely to go "off the rails" afterwards. More generally, to control the diversity of samples use either the temperature (i.e. vary `-t` between 0 and 1 and keep top-p off with `-p 0`) or the top-p value (i.e. vary `-p` between 0 and 1 and keep `-t 1`), but not both. Nice explainers on LLM sampling strategies include [this](https://peterchng.com/blog/2023/05/02/token-selection-strategies-top-k-top-p-and-temperature/), [this](https://docs.cohere.com/docs/controlling-generation-with-top-k-top-p) or [this](https://huggingface.co/blog/how-to-generate).
|
||||
|
||||
|
||||
## Meta's Llama 2 models
|
||||
|
||||
As the neural net architecture is identical, we can also inference the Llama 2 models released by Meta. Sadly there is a bit of friction here due to licensing (I can't directly upload the checkpoints, I think). So Step 1, get the Llama 2 checkpoints by following the [Meta instructions](https://github.com/facebookresearch/llama). Once we have those checkpoints, we have to convert them into the llama2.c format.
|
||||
For this we need to install the python dependencies (`pip install -r requirements.txt`) and then use the `export.py` file, e.g. for 7B model:
|
||||
|
||||
```bash
|
||||
python export.py llama2_7b.bin --meta-llama path/to/llama/model/7B
|
||||
```
|
||||
|
||||
The export will take ~10 minutes or so and generate a 26GB file (the weights of the 7B model in float32) called `llama2_7b.bin` in the current directory. It has been [reported](https://github.com/karpathy/llama2.c/pull/85) that despite efforts. I would not attempt to run anything above 7B right now for two reasons: first, 13B+ currently doesn't work because of integer flow in pointer arithmetic, which is yet to be fixed, and second, even if it were fixed, this repo is doing float32 inference right now, so it would be fairly unusably slow. Once the export is done, we can run it:
|
||||
|
||||
```bash
|
||||
./run llama2_7b.bin
|
||||
```
|
||||
|
||||
This ran at about 4 tokens/s compiled with [OpenMP](#OpenMP) on 96 threads on my CPU Linux box in the cloud. (On my MacBook Air M1, currently it's closer to 30 seconds per token if you just build with `make runfast`.) Example output:
|
||||
|
||||
> The purpose of this document is to highlight the state-of-the-art of CoO generation technologies, both recent developments and those in commercial use. The focus is on the technologies with the highest merit to become the dominating processes of the future and therefore to be technologies of interest to S&T ... R&D. As such, CoO generation technologies developed in Russia, Japan and Europe are described in some depth. The document starts with an introduction to cobalt oxides as complex products and a short view on cobalt as an essential material. The document continues with the discussion of the available CoO generation processes with respect to energy and capital consumption as well as to environmental damage.
|
||||
|
||||
base models... ¯\\_(ツ)_/¯. Since we can inference the base model, it should be possible to also inference the chat model quite easily, and have a conversation with it. And if we can find a way to run 7B more efficiently, we can start adding LoRA to our training script, and going wild with finetunes all within the repo!
|
||||
|
||||
You can also try Meta's Code Llama models even if support for them is incomplete. In particular, some hyperparameters changed (e.g. the constant in RoPE layer), so the inference is not exactly correct and a bit buggy right now. Looking into fixes. Make sure to build the tokenizer for the plain and instruct variants and pass it when doing inference.
|
||||
|
||||
```bash
|
||||
python export.py codellama2_7b.bin --meta-llama /path/to/CodeLlama-7b
|
||||
python tokenizer.py --tokenizer-model=/path/to/CodeLlama-7b/tokenizer.model
|
||||
./run codellama2_7b.bin -z /path/to/CodeLlama-7b/tokenizer.bin
|
||||
```
|
||||
|
||||
Chat with Code Llama Instruct:
|
||||
|
||||
```bash
|
||||
python export.py codellama2_7b_instruct.bin --meta-llama /path/to/CodeLlama-7b-Instruct
|
||||
python tokenizer.py --tokenizer-model=/path/to/CodeLlama-7b-Instruct/tokenizer.model
|
||||
./run codellama2_7b_instruct.bin -m chat -z /path/to/CodeLlama-7b-Instruct/tokenizer.bin
|
||||
```
|
||||
|
||||
|
||||
## huggingface models
|
||||
|
||||
We can load any huggingface models that use the Llama 2 architecture. See the script [export.py](export.py) and the `--hf` flag to export the model .bin file.
|
||||
|
||||
## models
|
||||
|
||||
For the sake of examples of smaller, from-scratch models, I trained a small model series on TinyStories. All of these trained in a few hours on my training setup (4X A100 40GB GPUs). The 110M took around 24 hours. I am hosting them on huggingface hub [tinyllamas](https://huggingface.co/karpathy/tinyllamas), both in the original PyTorch .pt, and also in the llama2.c format .bin:
|
||||
|
||||
| model | dim | n_layers | n_heads | n_kv_heads | max context length | parameters | val loss | download
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 260K | 64 | 5 | 8 | 4 | 512 | 260K | 1.297 | [stories260K](https://huggingface.co/karpathy/tinyllamas/tree/main/stories260K)
|
||||
| OG | 288 | 6 | 6 | 6 | 256 | 15M | 1.072 | [stories15M.bin](https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin) |
|
||||
| 42M| 512 | 8 | 8 | 8 | 1024 | 42M | 0.847 | [stories42M.bin](https://huggingface.co/karpathy/tinyllamas/resolve/main/stories42M.bin) |
|
||||
| 110M| 768 | 12 | 12 | 12 | 1024 | 110M | 0.760 | [stories110M.bin](https://huggingface.co/karpathy/tinyllamas/resolve/main/stories110M.bin) |
|
||||
|
||||
You'll notice that the 110M model is equivalent to GPT-1 in size. Alternatively, this is also the smallest model in the GPT-2 series (`GPT-2 small`), except the max context length is only 1024 instead of 2048. The only notable changes from GPT-1/2 architecture is that Llama uses RoPE relatively positional embeddings instead of absolute/learned positional embeddings, a bit more fancy SwiGLU non-linearity in the MLP, RMSNorm instead of LayerNorm, bias=False on all Linear layers, and is optionally multiquery.
|
||||
|
||||
|
||||
## training
|
||||
|
||||
Let's see how we can train a baby Llama 2 from scratch using the code in this repo. First let's download and pretokenize some source dataset, e.g. I like [TinyStories](https://huggingface.co/datasets/roneneldan/TinyStories) so this is the only example currently available in this repo. But it should be very easy to add datasets, see the code.
|
||||
|
||||
```bash
|
||||
python tinystories.py download
|
||||
python tinystories.py pretokenize
|
||||
```
|
||||
|
||||
Then train our model:
|
||||
|
||||
```bash
|
||||
python train.py
|
||||
```
|
||||
|
||||
**brief training guide**. See the train.py script for more exotic launches and hyperparameter overrides. Here is a brief guide to how to set the parameters. Look at the table at the very end of the [Chinchilla paper](https://arxiv.org/abs/2203.15556) to get a sense of how the Transformer parameters (dim, n_layers, n_heads) grow or shrink together. Extrapolate/interpolate this pattern to get bigger or smaller transformers. Set the max context length however you wish, depending on the problem: this should be the max number of tokens that matter to predict the next token. E.g. Llama 2 uses 2048. Next, you want the _total_ batch size per update (printed by the script as "tokens per iteration will be:") to be somewhere around 100K tokens for medium-sized applications. For tiny applications it could be lower, for large training (e.g. GPTs/LLamas) it is usually ~0.5M, or even more. You get there by first maxing out the batch_size to whatever your system allows (e.g. mine was 16 in a recent run because after that my GPU runs out of memory), and then you want to increase gradient_accumulation_steps to be as high as necessary to reach the total batch size of ~100K. Finally, you want to tune your learning_rate (LR). You want this to be as high as your training allows. Very small networks can get away with a large LR (e.g. 1e-3 or even higher). Large networks need lower LRs. 3e-4 is a safe choice in most medium-sized applications, but can be too low for small networks, so try to increase it! Finally, max_iters is the length of training. Play with different settings. I mostly only ever tune these parameters and leave most of the others unchanged. Here is an example of how I trained the 110M model, which I don't think is anywhere near optimal, but looked sensible to me: dim 768, n_layers 12, n_heads 12 (so size of each head is 768 / 12 = 64 channels), seq len of 1024, batch size 16 (this is the most that fit my A100 40GB GPU), gradient_accumulation_steps = 8 was needed to get total tokens batch size to be 16 batch size * 1024 tokens in sequence * 8 grad_accum = 131,072 tokens per update. Good. Learning rate 4e-4 (probably a little too low). max_iters 200K (probably a bit too high). Dropout 0.1, as that usually helps a bit at medium size. That was it. I ran using Distributed Data Parallel (DDP) on 4 GPUs on my cloud machine, training took ~day or so.
|
||||
|
||||
Totally understand if you want to skip model training, for simple demo just download one of the pretrained models (see [models](#models) section), e.g.:
|
||||
|
||||
```bash
|
||||
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
|
||||
```
|
||||
|
||||
Once we have the model.bin file, we can inference in C. Compile the C code first:
|
||||
|
||||
```bash
|
||||
llgo run . -m stories15M.bin
|
||||
```
|
||||
BIN
_demo/llama2-c/assets/llama_cute.jpg
Normal file
BIN
_demo/llama2-c/assets/llama_cute.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 183 KiB |
50
_demo/llama2-c/run.go
Normal file
50
_demo/llama2-c/run.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/llama2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var prompt *c.Char = c.Str("Once upon a time")
|
||||
var checkpointPath *c.Char = c.Str("stories15M.bin")
|
||||
var tokenizerPath *c.Char = c.Str("tokenizer.bin")
|
||||
var temperature, topp c.Float = 1.0, 0.9
|
||||
var steps c.Int = 256
|
||||
var rngSeed uint64 = uint64(c.Time(nil))
|
||||
|
||||
loop: // parse command line arguments
|
||||
for {
|
||||
switch c.Getopt(c.Argc, c.Argv, c.Str("m:")) {
|
||||
case 'm':
|
||||
checkpointPath = c.Optarg
|
||||
c.Fprintf(c.Stderr, c.Str("==> use model: %s\n"), checkpointPath)
|
||||
case -1:
|
||||
break loop
|
||||
}
|
||||
}
|
||||
if c.Optind < c.Argc {
|
||||
prompt = c.Index(c.Argv, c.Optind)
|
||||
c.Fprintf(c.Stderr, c.Str("==> prompt: %s\n"), prompt)
|
||||
}
|
||||
|
||||
// build the Transformer via the model .bin file
|
||||
var transformer llama2.Transformer
|
||||
llama2.BuildTransformer(&transformer, checkpointPath)
|
||||
|
||||
// build the Tokenizer via the tokenizer .bin file
|
||||
var tokenizer llama2.Tokenizer
|
||||
llama2.BuildTokenizer(&tokenizer, tokenizerPath, transformer.Config.VocabSize)
|
||||
|
||||
// build the Sampler
|
||||
var sampler llama2.Sampler
|
||||
llama2.BuildSampler(&sampler, transformer.Config.VocabSize, temperature, topp, rngSeed)
|
||||
|
||||
// run!
|
||||
llama2.Generate(&transformer, &tokenizer, &sampler, prompt, steps)
|
||||
|
||||
// memory and file handles cleanup
|
||||
llama2.FreeSampler(&sampler)
|
||||
llama2.FreeTokenizer(&tokenizer)
|
||||
llama2.FreeTransformer(&transformer)
|
||||
}
|
||||
BIN
_demo/llama2-c/tokenizer.bin
Normal file
BIN
_demo/llama2-c/tokenizer.bin
Normal file
Binary file not shown.
25
_demo/qsort/qsort.go
Normal file
25
_demo/qsort/qsort.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
func main() {
|
||||
a := [...]int{100, 8, 23, 2, 7}
|
||||
c.Qsort(c.Pointer(&a), 5, unsafe.Sizeof(0), func(a, b c.Pointer) c.Int {
|
||||
return c.Int(*(*int)(a) - *(*int)(b))
|
||||
})
|
||||
for _, v := range a {
|
||||
c.Printf(c.Str("%d\n"), v)
|
||||
}
|
||||
}
|
||||
|
||||
/* Expected output:
|
||||
2
|
||||
7
|
||||
8
|
||||
23
|
||||
100
|
||||
*/
|
||||
12
_pydemo/callpy/callpy.go
Normal file
12
_pydemo/callpy/callpy.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := math.Sqrt(py.Float(2))
|
||||
c.Printf(c.Str("sqrt(2) = %f\n"), x.Float64())
|
||||
}
|
||||
22
_pydemo/matrix/matrix.go
Normal file
22
_pydemo/matrix/matrix.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/numpy"
|
||||
)
|
||||
|
||||
func main() {
|
||||
a := py.List(
|
||||
py.List(1.0, 2.0, 3.0),
|
||||
py.List(4.0, 5.0, 6.0),
|
||||
py.List(7.0, 8.0, 9.0),
|
||||
)
|
||||
b := py.List(
|
||||
py.List(9.0, 8.0, 7.0),
|
||||
py.List(6.0, 5.0, 4.0),
|
||||
py.List(3.0, 2.0, 1.0),
|
||||
)
|
||||
x := numpy.Add(a, b)
|
||||
c.Printf(c.Str("a+b = %s\n"), x.Str().CStr())
|
||||
}
|
||||
15
_pydemo/max/max.go
Normal file
15
_pydemo/max/max.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/std"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := std.Max(py.Float(3.0), py.Float(9.0), py.Float(23.0), py.Float(100.0))
|
||||
std.Print(x)
|
||||
|
||||
list := py.List(3.0, 9.0, 23.0, 100.0)
|
||||
y := std.Max(std.Iter(list))
|
||||
std.Print(y)
|
||||
}
|
||||
10
_pydemo/pi/pi.go
Normal file
10
_pydemo/pi/pi.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c.Printf(c.Str("pi = %f\n"), math.Pi.Float64())
|
||||
}
|
||||
11
_pydemo/print/print.go
Normal file
11
_pydemo/print/print.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/std"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := py.Float(3.14)
|
||||
std.Print(x)
|
||||
}
|
||||
13
_pydemo/statistics/statistics.go
Normal file
13
_pydemo/statistics/statistics.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/statistics"
|
||||
)
|
||||
|
||||
func main() {
|
||||
list := py.List(1.0, 2.0, 3.0, 4.0, 4.0)
|
||||
mean := statistics.Mean(list)
|
||||
c.Printf(c.Str("mean(1, 2, 3, 4, 4) = %f\n"), mean.Float64())
|
||||
}
|
||||
16
_pydemo/tensor/tensor.go
Normal file
16
_pydemo/tensor/tensor.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/std"
|
||||
"github.com/goplus/llgo/py/torch"
|
||||
)
|
||||
|
||||
func main() {
|
||||
data := py.List(
|
||||
py.List(1.0, 2.0),
|
||||
py.List(3.0, 4.0),
|
||||
)
|
||||
x := torch.Tensor(data)
|
||||
std.Print(x)
|
||||
}
|
||||
159
c/c.go
Normal file
159
c/c.go
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package c
|
||||
|
||||
// typedef unsigned int uint;
|
||||
import "C"
|
||||
import "unsafe"
|
||||
|
||||
const (
|
||||
LLGoPackage = "decl"
|
||||
)
|
||||
|
||||
type (
|
||||
Char = int8
|
||||
Int = C.int
|
||||
Uint = C.uint
|
||||
Long = int32
|
||||
Ulong = uint32
|
||||
LongLong = int64
|
||||
UlongLong = uint64
|
||||
Float = float32
|
||||
Double = float64
|
||||
Pointer = unsafe.Pointer
|
||||
FilePtr = unsafe.Pointer
|
||||
)
|
||||
|
||||
type integer interface {
|
||||
~int | ~uint | ~uintptr | ~int32 | ~uint32 | ~int64 | ~uint64
|
||||
}
|
||||
|
||||
//go:linkname Str llgo.cstr
|
||||
func Str(string) *Char
|
||||
|
||||
// llgo:link Advance llgo.advance
|
||||
func Advance[PtrT any](ptr PtrT, offset int) PtrT { return ptr }
|
||||
|
||||
// llgo:link Index llgo.index
|
||||
func Index[T any, I integer](ptr *T, offset I) T { return *ptr }
|
||||
|
||||
//go:linkname Alloca llgo.alloca
|
||||
func Alloca(size uintptr) Pointer
|
||||
|
||||
//go:linkname AllocaCStr llgo.allocaCStr
|
||||
func AllocaCStr(s string) *Char
|
||||
|
||||
//go:linkname Unreachable llgo.unreachable
|
||||
func Unreachable()
|
||||
|
||||
//go:linkname Malloc C.malloc
|
||||
func Malloc(size uintptr) Pointer
|
||||
|
||||
//go:linkname Memcpy C.memcpy
|
||||
func Memcpy(dst, src Pointer, n uintptr) Pointer
|
||||
|
||||
//go:linkname Memset C.memset
|
||||
func Memset(s Pointer, c Int, n uintptr) Pointer
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname GoStringData llgo.stringData
|
||||
func GoStringData(string) *Char
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Remove C.remove
|
||||
func Remove(path *Char) Int
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Exit C.exit
|
||||
func Exit(Int)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Rand C.rand
|
||||
func Rand() Int
|
||||
|
||||
//go:linkname Qsort C.qsort
|
||||
func Qsort(base Pointer, count, elem uintptr, compar func(a, b Pointer) Int)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Stdin __stdinp
|
||||
var Stdin FilePtr
|
||||
|
||||
//go:linkname Stdout __stdoutp
|
||||
var Stdout FilePtr
|
||||
|
||||
//go:linkname Stderr __stderrp
|
||||
var Stderr FilePtr
|
||||
|
||||
//go:linkname Printf C.printf
|
||||
func Printf(format *Char, __llgo_va_list ...any) Int
|
||||
|
||||
//go:linkname Fprintf C.fprintf
|
||||
func Fprintf(fp FilePtr, format *Char, __llgo_va_list ...any) Int
|
||||
|
||||
//go:linkname Fwrite C.fwrite
|
||||
func Fwrite(data Pointer, size, count uintptr, fp FilePtr) uintptr
|
||||
|
||||
//go:linkname Fputc C.fputc
|
||||
func Fputc(c Int, fp FilePtr) Int
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Time C.time
|
||||
func Time(*int32) int32
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
type Option struct {
|
||||
Name *Char
|
||||
HasArg Int
|
||||
Flag *Int
|
||||
Val Int
|
||||
}
|
||||
|
||||
//go:linkname Argc __llgo_argc
|
||||
var Argc Int
|
||||
|
||||
//go:linkname Argv __llgo_argv
|
||||
var Argv **Char
|
||||
|
||||
//go:linkname Optarg optarg
|
||||
var Optarg *Char
|
||||
|
||||
//go:linkname Optind optind
|
||||
var Optind Int
|
||||
|
||||
//go:linkname Opterr opterr
|
||||
var Opterr Int
|
||||
|
||||
//go:linkname Optopt optopt
|
||||
var Optopt Int
|
||||
|
||||
//go:linkname Getopt C.getopt
|
||||
func Getopt(argc Int, argv **Char, optstring *Char) Int
|
||||
|
||||
//go:linkname GetoptLong C.getopt_long
|
||||
func GetoptLong(argc Int, argv **Char, optstring *Char, longopts *Option, longindex *Int) Int
|
||||
|
||||
//go:linkname GetoptLongOnly C.getopt_long_only
|
||||
func GetoptLongOnly(argc Int, argv **Char, optstring *Char, longopts *Option, longindex *Int) Int
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
35
c/cjson/README.md
Normal file
35
c/cjson/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
LLGo wrapper of DaveGamble/cJSON
|
||||
=====
|
||||
[](https://github.com/goplus/cjson/actions/workflows/go.yml)
|
||||
[](https://github.com/goplus/cjson/releases)
|
||||
[](https://pkg.go.dev/github.com/goplus/cjson)
|
||||
[](https://github.com/goplus/llgo)
|
||||
[](https://github.com/goplus/gop)
|
||||
|
||||
## How to install
|
||||
|
||||
```sh
|
||||
git clone https://github.com/goplus/cjson.git
|
||||
cd cjson
|
||||
git submodule init
|
||||
git submodule update
|
||||
mkdir build.dir
|
||||
cd build.dir
|
||||
cmake ../cJSON
|
||||
sudo make install
|
||||
```
|
||||
|
||||
## Demos
|
||||
|
||||
The `_demo` directory contains our demos (it start with `_` to prevent the `go` command from compiling it):
|
||||
|
||||
* [mkjson](_demo/mkjson/mkjson.go): create a json object and print it
|
||||
|
||||
### How to run demos
|
||||
|
||||
To run the demos in directory `_demo`:
|
||||
|
||||
```sh
|
||||
cd <demo-directory> # eg. cd _demo/mkjson
|
||||
llgo run .
|
||||
```
|
||||
27
c/cjson/_demo/mkjson/mkjson.go
Normal file
27
c/cjson/_demo/mkjson/mkjson.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/cjson"
|
||||
)
|
||||
|
||||
func main() {
|
||||
mod := cjson.Object()
|
||||
mod.SetItem(c.Str("name"), cjson.String(c.Str("math")))
|
||||
|
||||
syms := cjson.Array()
|
||||
|
||||
fn := cjson.Object()
|
||||
fn.SetItem(c.Str("name"), cjson.String(c.Str("sqrt")))
|
||||
fn.SetItem(c.Str("sig"), cjson.String(c.Str("(x, /)")))
|
||||
syms.AddItem(fn)
|
||||
|
||||
v := cjson.Object()
|
||||
v.SetItem(c.Str("name"), cjson.String(c.Str("pi")))
|
||||
syms.AddItem(v)
|
||||
|
||||
mod.SetItem(c.Str("items"), syms)
|
||||
|
||||
c.Printf(c.Str("%s\n"), mod.CStr())
|
||||
mod.Delete()
|
||||
}
|
||||
121
c/cjson/cjson.go
Normal file
121
c/cjson/cjson.go
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package cjson
|
||||
|
||||
import (
|
||||
_ "unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
const (
|
||||
LLGoPackage = "link: cjson"
|
||||
)
|
||||
|
||||
// llgo:type C
|
||||
type JSON struct {
|
||||
Unused [0]byte
|
||||
}
|
||||
|
||||
//go:linkname Null C.cJSON_CreateNull
|
||||
func Null() *JSON
|
||||
|
||||
//go:linkname True C.cJSON_CreateTrue
|
||||
func True() *JSON
|
||||
|
||||
//go:linkname False C.cJSON_CreateFalse
|
||||
func False() *JSON
|
||||
|
||||
//go:linkname Bool C.cJSON_CreateBool
|
||||
func Bool(boolean c.Int) *JSON
|
||||
|
||||
//go:linkname Number C.cJSON_CreateNumber
|
||||
func Number(num float64) *JSON
|
||||
|
||||
//go:linkname String C.cJSON_CreateString
|
||||
func String(str *c.Char) *JSON
|
||||
|
||||
//go:linkname Array C.cJSON_CreateArray
|
||||
func Array() *JSON
|
||||
|
||||
//go:linkname Object C.cJSON_CreateObject
|
||||
func Object() *JSON
|
||||
|
||||
// raw json
|
||||
//
|
||||
//go:linkname Raw C.cJSON_CreateRaw
|
||||
func Raw(raw *c.Char) *JSON
|
||||
|
||||
// Create a string where valuestring references a string so
|
||||
// it will not be freed by Delete
|
||||
//
|
||||
//go:linkname StringRef C.cJSON_CreateStringReference
|
||||
func StringRef(str *c.Char) *JSON
|
||||
|
||||
// Create an object that only references it's elements so
|
||||
// they will not be freed by Delete
|
||||
//
|
||||
//go:linkname ObjectRef C.cJSON_CreateObjectReference
|
||||
func ObjectRef(child *JSON) *JSON
|
||||
|
||||
// Create an array that only references it's elements so
|
||||
// they will not be freed by Delete
|
||||
//
|
||||
//go:linkname ArrayRef C.cJSON_CreateArrayReference
|
||||
func ArrayRef(child *JSON) *JSON
|
||||
|
||||
// Delete a JSON entity and all subentities.
|
||||
//
|
||||
// llgo:link (*JSON).Delete C.cJSON_Delete
|
||||
func (o *JSON) Delete() {}
|
||||
|
||||
// Append item to the specified array.
|
||||
//
|
||||
// llgo:link (*JSON).AddItem C.cJSON_AddItemToArray
|
||||
func (o *JSON) AddItem(item *JSON) c.Int { return 0 }
|
||||
|
||||
// Append item to the specified object.
|
||||
//
|
||||
// llgo:link (*JSON).SetItem C.cJSON_AddItemToObject
|
||||
func (o *JSON) SetItem(key *c.Char, item *JSON) c.Int { return 0 }
|
||||
|
||||
// llgo:link (*JSON).CStr C.cJSON_PrintUnformatted
|
||||
func (o *JSON) CStr() *c.Char { return nil }
|
||||
|
||||
// Same as CStr. Provided for Go+.
|
||||
//
|
||||
// llgo:link (*JSON).Cstr C.cJSON_PrintUnformatted
|
||||
func (o *JSON) Cstr() *c.Char { return nil }
|
||||
|
||||
// Render a JSON entity to text for transfer/storage.
|
||||
//
|
||||
// llgo:link (*JSON).Print C.cJSON_Print
|
||||
func (o *JSON) Print() *c.Char { return nil }
|
||||
|
||||
// Render a JSON entity to text for transfer/storage without any formatting.
|
||||
//
|
||||
// llgo:link (*JSON).PrintUnformatted C.cJSON_PrintUnformatted
|
||||
func (o *JSON) PrintUnformatted() *c.Char { return nil }
|
||||
|
||||
// Render a JSON entity to text using a buffered strategy.
|
||||
//
|
||||
// prebuffer is a guess at the final size. guessing well reduces reallocation.
|
||||
//
|
||||
// fmt=0 gives unformatted, =1 gives formatted.
|
||||
//
|
||||
// llgo:link (*JSON).PrintBuffered C.cJSON_PrintBuffered
|
||||
func (o *JSON) PrintBuffered(prebuffer c.Int, fmt c.Int) *c.Char { return nil }
|
||||
BIN
c/cjson/llgo_autogen.lla
Normal file
BIN
c/cjson/llgo_autogen.lla
Normal file
Binary file not shown.
26
c/llama2/.gitignore
vendored
Normal file
26
c/llama2/.gitignore
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
stories*.bin
|
||||
.DS_Store
|
||||
err.log
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
*.swp
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work*
|
||||
1
c/llama2/llama2.c
Submodule
1
c/llama2/llama2.c
Submodule
Submodule c/llama2/llama2.c added at b3c4b6c3c4
159
c/llama2/llama2.go
Normal file
159
c/llama2/llama2.go
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package llama2
|
||||
|
||||
import (
|
||||
_ "unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
const (
|
||||
LLGoPackage = "link"
|
||||
)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// llgo:type C
|
||||
type TokenIndex struct {
|
||||
Str *c.Char
|
||||
Id c.Int
|
||||
}
|
||||
|
||||
// llgo:type C
|
||||
type Tokenizer struct {
|
||||
Vocab **c.Char
|
||||
VocabScores *c.Float
|
||||
SortedVocab *TokenIndex
|
||||
VocabSize c.Int
|
||||
MaxTokenLength c.Uint
|
||||
BytePieces [512]uint8 // stores all single-byte strings
|
||||
}
|
||||
|
||||
//go:linkname BuildTokenizer C.build_tokenizer
|
||||
func BuildTokenizer(t *Tokenizer, tokenizerPath *c.Char, vocabSize c.Int)
|
||||
|
||||
//go:linkname FreeTokenizer C.free_tokenizer
|
||||
func FreeTokenizer(t *Tokenizer)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// llgo:type C
|
||||
type Config struct {
|
||||
Dim c.Int // transformer dimension
|
||||
HiddenDim c.Int // for ffn layers
|
||||
NLayers c.Int // number of layers
|
||||
NHeads c.Int // number of query heads
|
||||
NKVHeads c.Int // number of key/value heads (can be < query heads because of multiquery)
|
||||
VocabSize c.Int // vocabulary size, usually 256 (byte-level)
|
||||
SeqLen c.Int // max sequence length
|
||||
}
|
||||
|
||||
// llgo:type C
|
||||
type TransformerWeights struct {
|
||||
// token embedding table
|
||||
TokenEmbeddingTable *c.Float // (vocab_size, dim)
|
||||
// weights for rmsnorms
|
||||
RmsAttWeight *c.Float // (layer, dim) rmsnorm weights
|
||||
RmsFfnWeight *c.Float // (layer, dim)
|
||||
// weights for matmuls. note dim == n_heads * head_size
|
||||
Wq *c.Float // (layer, dim, n_heads * head_size)
|
||||
Wk *c.Float // (layer, dim, n_kv_heads * head_size)
|
||||
Wv *c.Float // (layer, dim, n_kv_heads * head_size)
|
||||
Wo *c.Float // (layer, n_heads * head_size, dim)
|
||||
// weights for ffn
|
||||
W1 *c.Float // (layer, hidden_dim, dim)
|
||||
W2 *c.Float // (layer, dim, hidden_dim)
|
||||
W3 *c.Float // (layer, hidden_dim, dim)
|
||||
// final rmsnorm
|
||||
RmsFinalWeight *c.Float // (dim,)
|
||||
// (optional) classifier weights for the logits, on the last layer
|
||||
Wcls *c.Float
|
||||
}
|
||||
|
||||
// llgo:type C
|
||||
type RunState struct {
|
||||
// current wave of activations
|
||||
X *c.Float // activation at current time stamp (dim,)
|
||||
Xb *c.Float // same, but inside a residual branch (dim,)
|
||||
Xb2 *c.Float // an additional buffer just for convenience (dim,)
|
||||
Hb *c.Float // buffer for hidden dimension in the ffn (hidden_dim,)
|
||||
Hb2 *c.Float // buffer for hidden dimension in the ffn (hidden_dim,)
|
||||
Q *c.Float // query (dim,)
|
||||
K *c.Float // key (dim,)
|
||||
V *c.Float // value (dim,)
|
||||
Att *c.Float // buffer for scores/attention values (n_heads, seq_len)
|
||||
Logits *c.Float // output logits
|
||||
// kv cache
|
||||
KeyCache *c.Float // (layer, seq_len, dim)
|
||||
ValueCache *c.Float // (layer, seq_len, dim)
|
||||
}
|
||||
|
||||
// llgo:type C
|
||||
type Transformer struct {
|
||||
Config Config // the hyperparameters of the architecture (the blueprint)
|
||||
Weights TransformerWeights // the weights of the model
|
||||
State RunState // buffers for the "wave" of activations in the forward pass
|
||||
|
||||
// some more state needed to properly clean up the memory mapping (sigh)
|
||||
Fd c.Int // file descriptor for memory mapping
|
||||
Data *c.Float // memory mapped data pointer
|
||||
FileSize uintptr // size of the checkpoint file in bytes
|
||||
}
|
||||
|
||||
//go:linkname BuildTransformer C.build_transformer
|
||||
func BuildTransformer(t *Transformer, checkpointPath *c.Char)
|
||||
|
||||
//go:linkname FreeTransformer C.free_transformer
|
||||
func FreeTransformer(t *Transformer)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// llgo:type C
|
||||
type ProbIndex struct {
|
||||
Prob c.Float
|
||||
Index c.Int
|
||||
} // struct used when sorting probabilities during top-p sampling
|
||||
|
||||
// llgo:type C
|
||||
type Sampler struct {
|
||||
VocabSize c.Int
|
||||
Probindex *ProbIndex // buffer used in top-p sampling
|
||||
Temperature c.Float
|
||||
Topp c.Float
|
||||
RngState uint64
|
||||
}
|
||||
|
||||
//go:linkname BuildSampler C.build_sampler
|
||||
func BuildSampler(sampler *Sampler, vocabSize c.Int, temperature c.Float, topp c.Float, rngSeed uint64)
|
||||
|
||||
//go:linkname FreeSampler C.free_sampler
|
||||
func FreeSampler(sampler *Sampler)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Generate C.generate
|
||||
func Generate(
|
||||
transformer *Transformer, tokenizer *Tokenizer, sampler *Sampler,
|
||||
prompt *c.Char, steps c.Int)
|
||||
|
||||
//go:linkname Chat C.chat
|
||||
func Chat(
|
||||
transformer *Transformer, tokenizer *Tokenizer, sampler *Sampler,
|
||||
cliUserPrompt *c.Char, cliSystemPrompt *c.Char, steps c.Int)
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
2
c/llama2/llama2/run.c
Normal file
2
c/llama2/llama2/run.c
Normal file
@@ -0,0 +1,2 @@
|
||||
#define TESTING
|
||||
#include "../llama2.c/run.c"
|
||||
6
c/llama2/llgo.cfg
Normal file
6
c/llama2/llgo.cfg
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"cl": [
|
||||
"clang -emit-llvm -S -o llgo_autogen.ll -c llama2/run.c",
|
||||
"rm llgo_autogen.lla; zip llgo_autogen.lla llgo_autogen.ll"
|
||||
]
|
||||
}
|
||||
BIN
c/llama2/llgo_autogen.lla
Normal file
BIN
c/llama2/llgo_autogen.lla
Normal file
Binary file not shown.
35
c/sqlite/README.md
Normal file
35
c/sqlite/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
LLGo wrapper of sqlite
|
||||
=====
|
||||
[](https://github.com/goplus/sqlite/actions/workflows/go.yml)
|
||||
[](https://github.com/goplus/sqlite/releases)
|
||||
[](https://pkg.go.dev/github.com/goplus/sqlite)
|
||||
[](https://github.com/goplus/llgo)
|
||||
[](https://github.com/goplus/gop)
|
||||
|
||||
## How to install
|
||||
|
||||
```sh
|
||||
git clone https://github.com/goplus/sqlite.git
|
||||
cd sqlite
|
||||
git submodule init
|
||||
git submodule update
|
||||
mkdir build.dir
|
||||
cd build.dir
|
||||
../sqlite/configure --enable-shared
|
||||
sudo make install
|
||||
```
|
||||
|
||||
## Demos
|
||||
|
||||
The `_demo` directory contains our demos (it start with `_` to prevent the `go` command from compiling it):
|
||||
|
||||
* [sqlitedemo](_demo/sqlitedemo/demo.go): a basic sqlite demo
|
||||
|
||||
### How to run demos
|
||||
|
||||
To run the demos in directory `_demo`:
|
||||
|
||||
```sh
|
||||
cd <demo-directory> # eg. cd _demo/sqlitedemo
|
||||
llgo run .
|
||||
```
|
||||
61
c/sqlite/_demo/sqlitedemo/demo.go
Normal file
61
c/sqlite/_demo/sqlitedemo/demo.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/sqlite"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c.Remove(c.Str("test.db"))
|
||||
|
||||
db, err := sqlite.Open(c.Str("test.db"))
|
||||
check(err, db, "sqlite: Open")
|
||||
|
||||
err = db.Exec(c.Str("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"), nil, nil, nil)
|
||||
check(err, db, "sqlite: Exec CREATE TABLE")
|
||||
|
||||
stmt, err := db.PrepareV3("INSERT INTO users (id, name) VALUES (?, ?)", 0, nil)
|
||||
check(err, db, "sqlite: PrepareV3 INSERT")
|
||||
|
||||
stmt.BindInt(1, 100)
|
||||
stmt.BindText(2, c.Str("Hello World"), -1, nil)
|
||||
|
||||
err = stmt.Step()
|
||||
checkDone(err, db, "sqlite: Step INSERT 1")
|
||||
|
||||
stmt.Reset()
|
||||
stmt.BindInt(1, 200)
|
||||
stmt.BindText(2, c.Str("This is llgo"), -1, nil)
|
||||
|
||||
err = stmt.Step()
|
||||
checkDone(err, db, "sqlite: Step INSERT 2")
|
||||
|
||||
stmt.Close()
|
||||
|
||||
stmt, err = db.PrepareV3("SELECT * FROM users", 0, nil)
|
||||
check(err, db, "sqlite: PrepareV3 SELECT")
|
||||
|
||||
for {
|
||||
if err = stmt.Step(); err != sqlite.HasRow {
|
||||
break
|
||||
}
|
||||
c.Printf(c.Str("==> id=%d, name=%s\n"), stmt.ColumnInt(0), stmt.ColumnText(1))
|
||||
}
|
||||
checkDone(err, db, "sqlite: Step done")
|
||||
|
||||
stmt.Close()
|
||||
db.Close()
|
||||
}
|
||||
|
||||
func check(err sqlite.Errno, db *sqlite.Sqlite3, at string) {
|
||||
if err != sqlite.OK {
|
||||
c.Printf(c.Str("==> %s Error: (%d) %s\n"), c.AllocaCStr(at), err, db.Errmsg())
|
||||
c.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func checkDone(err sqlite.Errno, db *sqlite.Sqlite3, at string) {
|
||||
if err != sqlite.Done {
|
||||
check(err, db, at)
|
||||
}
|
||||
}
|
||||
BIN
c/sqlite/llgo_autogen.lla
Normal file
BIN
c/sqlite/llgo_autogen.lla
Normal file
Binary file not shown.
262
c/sqlite/sqlite.go
Normal file
262
c/sqlite/sqlite.go
Normal file
@@ -0,0 +1,262 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sqlite
|
||||
|
||||
import (
|
||||
_ "unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
const (
|
||||
LLGoPackage = "link: sqlite3"
|
||||
)
|
||||
|
||||
// llgo:type C
|
||||
type Sqlite3 struct {
|
||||
Unused [8]byte
|
||||
}
|
||||
|
||||
// llgo:type C
|
||||
type Stmt struct {
|
||||
Unused [8]byte
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
type Errno c.Int
|
||||
|
||||
const (
|
||||
OK Errno = 0 // Successful result
|
||||
|
||||
Error Errno = 1 // Generic error
|
||||
ErrInternal Errno = 2 // Internal logic error in SQLite
|
||||
ErrPerm Errno = 3 // Access permission denied
|
||||
ErrAbort Errno = 4 // Callback routine requested an abort
|
||||
ErrBusy Errno = 5 // The database file is locked
|
||||
ErrLocked Errno = 6 // A table in the database is locked
|
||||
ErrNomem Errno = 7 // A malloc() failed
|
||||
ErrReadOnly Errno = 8 // Attempt to write a readonly database
|
||||
ErrInterrupt Errno = 9 // Operation terminated by sqlite3_interrupt()
|
||||
ErrIo Errno = 10 // Some kind of disk I/O error occurred
|
||||
ErrCorrupt Errno = 11 // The database disk image is malformed
|
||||
ErrNotfound Errno = 12 // Unknown opcode in sqlite3_file_control()
|
||||
ErrFull Errno = 13 // Insertion failed because database is full
|
||||
ErrCantopen Errno = 14 // Unable to open the database file
|
||||
ErrProtocol Errno = 15 // Database lock protocol error
|
||||
_ErrEmpty Errno = 16 // Internal use only
|
||||
ErrSchema Errno = 17 // The database schema changed
|
||||
ErrToobig Errno = 18 // String or BLOB exceeds size limit
|
||||
ErrConstraint Errno = 19 // Abort due to constraint violation
|
||||
ErrMismatch Errno = 20 // Data type mismatch
|
||||
ErrMisuse Errno = 21 // Library used incorrectly
|
||||
ErrNolfs Errno = 22 // Uses OS features not supported on host
|
||||
ErrAuth Errno = 23 // Authorization denied
|
||||
_ErrFormat Errno = 24 // Not used
|
||||
ErrRange Errno = 25 // 2nd parameter to sqlite3_bind out of range
|
||||
ErrNotadb Errno = 26 // File opened that is not a database file
|
||||
ErrNotice Errno = 27 // Notifications from sqlite3_log()
|
||||
ErrWarning Errno = 28 // Warnings from sqlite3_log()
|
||||
|
||||
HasRow Errno = 100 // sqlite3_step() has another row ready
|
||||
Done Errno = 101 // sqlite3_step() has finished executing
|
||||
)
|
||||
|
||||
// llgo:link Errno.Errstr C.sqlite3_errstr
|
||||
func (err Errno) Errstr() *c.Char { return nil }
|
||||
|
||||
// llgo:link (*Sqlite3).Errmsg C.sqlite3_errmsg
|
||||
func (db *Sqlite3) Errmsg() *c.Char { return nil }
|
||||
|
||||
// llgo:link (*Sqlite3).Errcode C.sqlite3_errcode
|
||||
func (db *Sqlite3) Errcode() Errno { return 0 }
|
||||
|
||||
// llgo:link (*Sqlite3).ExtendedErrcode C.sqlite3_extended_errcode
|
||||
func (db *Sqlite3) ExtendedErrcode() Errno { return 0 }
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname doOpen C.sqlite3_open
|
||||
func doOpen(filename *c.Char, ppDb **Sqlite3) Errno
|
||||
|
||||
//go:linkname doOpenV2 C.sqlite3_open_v2
|
||||
func doOpenV2(filename *c.Char, ppDb **Sqlite3, flags OpenFlags, zVfs *c.Char) Errno
|
||||
|
||||
// OpenFlags represents SQLite open flags.
|
||||
type OpenFlags c.Int
|
||||
|
||||
const (
|
||||
OpenReadOnly OpenFlags = 0x00000001
|
||||
OpenReadWrite OpenFlags = 0x00000002
|
||||
OpenCreate OpenFlags = 0x00000004
|
||||
OpenDeleteOnClose OpenFlags = 0x00000008 // VFS only
|
||||
OpenExclusive OpenFlags = 0x00000010 // VFS only
|
||||
OpenAutoProxy OpenFlags = 0x00000020 // VFS only
|
||||
OpenUri OpenFlags = 0x00000040
|
||||
OpenMemory OpenFlags = 0x00000080
|
||||
OpenMainDb OpenFlags = 0x00000100 // VFS only
|
||||
OpenTempDb OpenFlags = 0x00000200 // VFS only
|
||||
OpenTransientDb OpenFlags = 0x00000400 // VFS only
|
||||
OpenMainJournal OpenFlags = 0x00000800 // VFS only
|
||||
OpenTempJournal OpenFlags = 0x00001000 // VFS only
|
||||
OpenSubJournal OpenFlags = 0x00002000 // VFS only
|
||||
OpenSuperJournal OpenFlags = 0x00004000 // VFS only
|
||||
OpenNoMutex OpenFlags = 0x00008000
|
||||
OpenFullMutex OpenFlags = 0x00010000
|
||||
OpenSharedCache OpenFlags = 0x00020000
|
||||
OpenPrivateCache OpenFlags = 0x00040000
|
||||
OpenWal OpenFlags = 0x00080000 // VFS only
|
||||
OpenNoFollow OpenFlags = 0x01000000
|
||||
OpenExResCode OpenFlags = 0x02000000 // Extended result codes
|
||||
)
|
||||
|
||||
// Opening A New Database Connection
|
||||
// filename: Database filename (UTF-8)
|
||||
func Open(filename *c.Char) (db *Sqlite3, err Errno) {
|
||||
err = doOpen(filename, &db)
|
||||
return
|
||||
}
|
||||
|
||||
// Opening A New Database Connection
|
||||
// filename: Database filename (UTF-8)
|
||||
// zVfs: Name of VFS module to use
|
||||
func OpenV2(filename *c.Char, flags OpenFlags, zVfs *c.Char) (db *Sqlite3, err Errno) {
|
||||
err = doOpenV2(filename, &db, flags, zVfs)
|
||||
return
|
||||
}
|
||||
|
||||
// Closing A Database Connection
|
||||
//
|
||||
// llgo:link (*Sqlite3).Close C.sqlite3_close
|
||||
func (db *Sqlite3) Close() Errno { return 0 }
|
||||
|
||||
// Closing A Database Connection
|
||||
//
|
||||
// llgo:link (*Sqlite3).CloseV2 C.sqlite3_close_v2
|
||||
func (db *Sqlite3) CloseV2() Errno { return 0 }
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// llgo:link (*Sqlite3).doPrepare C.sqlite3_prepare
|
||||
func (*Sqlite3) doPrepare(*c.Char, c.Int, **Stmt, **c.Char) Errno {
|
||||
return 0
|
||||
}
|
||||
|
||||
// llgo:link (*Sqlite3).doPrepareV2 C.sqlite3_prepare_v2
|
||||
func (*Sqlite3) doPrepareV2(*c.Char, c.Int, **Stmt, **c.Char) Errno {
|
||||
return 0
|
||||
}
|
||||
|
||||
// llgo:link (*Sqlite3).doPrepareV3 C.sqlite3_prepare_v3
|
||||
func (*Sqlite3) doPrepareV3(*c.Char, c.Int, PrepareFlags, **Stmt, **c.Char) Errno {
|
||||
return 0
|
||||
}
|
||||
|
||||
// PrepareFlags represents SQLite prepare flags.
|
||||
type PrepareFlags c.Int
|
||||
|
||||
const (
|
||||
PreparePersistent PrepareFlags = 0x01
|
||||
PrepareNormalize PrepareFlags = 0x02
|
||||
PrepareNoVtab PrepareFlags = 0x04
|
||||
)
|
||||
|
||||
// Compiling An SQL Statement
|
||||
// tail: Pointer to unused portion of sql
|
||||
func (db *Sqlite3) Prepare(sql string, tail **c.Char) (stmt *Stmt, err Errno) {
|
||||
err = db.doPrepare(c.GoStringData(sql), c.Int(len(sql)), &stmt, tail)
|
||||
return
|
||||
}
|
||||
|
||||
func (db *Sqlite3) PrepareV2(sql string, tail **c.Char) (stmt *Stmt, err Errno) {
|
||||
err = db.doPrepareV2(c.GoStringData(sql), c.Int(len(sql)), &stmt, tail)
|
||||
return
|
||||
}
|
||||
|
||||
func (db *Sqlite3) PrepareV3(sql string, flags PrepareFlags, tail **c.Char) (stmt *Stmt, err Errno) {
|
||||
err = db.doPrepareV3(c.GoStringData(sql), c.Int(len(sql)), flags, &stmt, tail)
|
||||
return
|
||||
}
|
||||
|
||||
// Destroy A Prepared Statement Object
|
||||
//
|
||||
// llgo:link (*Stmt).Close C.sqlite3_finalize
|
||||
func (stmt *Stmt) Close() Errno { return 0 }
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// llgo:link (*Stmt).BindInt C.sqlite3_bind_int
|
||||
func (*Stmt) BindInt(idx c.Int, val c.Int) Errno { return 0 }
|
||||
|
||||
// llgo:link (*Stmt).BindInt64 C.sqlite3_bind_int64
|
||||
func (*Stmt) BindInt64(idx c.Int, val int64) Errno { return 0 }
|
||||
|
||||
/*
|
||||
const (
|
||||
Static = (func(Pointer))(nil) // val is a static string
|
||||
Transient = (func(Pointer))(-1) // val is a transient (temporary) string
|
||||
)
|
||||
*/
|
||||
|
||||
// llgo:link (*Stmt).BindText C.sqlite3_bind_text
|
||||
func (*Stmt) BindText(idx c.Int, val *c.Char, nByte c.Int, destructor func(c.Pointer)) Errno {
|
||||
return 0
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// Reset A Prepared Statement Object
|
||||
//
|
||||
// llgo:link (*Stmt).Reset C.sqlite3_reset
|
||||
func (stmt *Stmt) Reset() Errno {
|
||||
return 0
|
||||
}
|
||||
|
||||
// Evaluate An SQL Statement
|
||||
//
|
||||
// llgo:link (*Stmt).Step C.sqlite3_step
|
||||
func (*Stmt) Step() Errno { return 0 }
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// llgo:link (*Stmt).ColumnCount C.sqlite3_column_count
|
||||
func (stmt *Stmt) ColumnCount() c.Int { return 0 }
|
||||
|
||||
// llgo:link (*Stmt).ColumnName C.sqlite3_column_name
|
||||
func (stmt *Stmt) ColumnName(idx c.Int) *c.Char { return nil }
|
||||
|
||||
// llgo:link (*Stmt).ColumnInt C.sqlite3_column_int
|
||||
func (stmt *Stmt) ColumnInt(idx c.Int) c.Int { return 0 }
|
||||
|
||||
// llgo:link (*Stmt).ColumnInt64 C.sqlite3_column_int64
|
||||
func (stmt *Stmt) ColumnInt64(idx c.Int) int64 { return 0 }
|
||||
|
||||
// llgo:link (*Stmt).ColumnText C.sqlite3_column_text
|
||||
func (stmt *Stmt) ColumnText(idx c.Int) *c.Char { return nil }
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// One-Step Query Execution Interface
|
||||
//
|
||||
// llgo:link (*Sqlite3).Exec C.sqlite3_exec
|
||||
func (*Sqlite3) Exec(
|
||||
sql *c.Char, callback func(arg c.Pointer, resultCols c.Int, colVals, colNames **c.Char) c.Int,
|
||||
arg c.Pointer, errmsg **c.Char) Errno {
|
||||
return 0
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
60
chore/_xtool/pydump/pydump.go
Normal file
60
chore/_xtool/pydump/pydump.go
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/cjson"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/inspect"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if c.Argc < 2 {
|
||||
c.Fprintf(c.Stderr, c.Str("Usage: pydump <pythonLibPath>\n"))
|
||||
return
|
||||
}
|
||||
pyLib := c.Index(c.Argv, 1)
|
||||
|
||||
py.Initialize()
|
||||
|
||||
root := cjson.Object()
|
||||
root.SetItem(c.Str("name"), cjson.String(pyLib))
|
||||
|
||||
items := cjson.Array()
|
||||
mod := py.ImportModule(pyLib)
|
||||
keys := mod.ModuleGetDict().DictKeys()
|
||||
for i, n := uintptr(0), keys.ListLen(); i < n; i++ {
|
||||
key := keys.ListItem(i)
|
||||
val := mod.GetAttr(key)
|
||||
doc := val.GetAttrString(c.Str("__doc__"))
|
||||
sym := cjson.Object()
|
||||
sym.SetItem(c.Str("type"), cjson.String(val.Type().TypeName().CStr()))
|
||||
sym.SetItem(c.Str("name"), cjson.String(key.CStr()))
|
||||
if doc != nil {
|
||||
sym.SetItem(c.Str("doc"), cjson.String(doc.CStr()))
|
||||
}
|
||||
if val.Callable() != 0 {
|
||||
sig := inspect.Signature(val)
|
||||
sym.SetItem(c.Str("sig"), cjson.String(sig.Str().CStr()))
|
||||
}
|
||||
items.AddItem(sym)
|
||||
}
|
||||
root.SetItem(c.Str("items"), items)
|
||||
|
||||
c.Printf(c.Str("%s\n"), root.CStr())
|
||||
}
|
||||
@@ -22,7 +22,7 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/goplus/llgo/x/ar"
|
||||
"github.com/goplus/llgo/xtool/ar"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
71
chore/clangast/clangast.go
Normal file
71
chore/clangast/clangast.go
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright (c) 2022 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/goplus/llgo/xtool/clang/parser"
|
||||
)
|
||||
|
||||
var (
|
||||
dump = flag.Bool("dump", false, "dump AST")
|
||||
)
|
||||
|
||||
func usage() {
|
||||
fmt.Fprintf(os.Stderr, "Usage: clangast [-dump] source.i\n")
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Usage = usage
|
||||
flag.Parse()
|
||||
if flag.NArg() < 1 {
|
||||
usage()
|
||||
return
|
||||
}
|
||||
var file = flag.Arg(0)
|
||||
var err error
|
||||
if *dump {
|
||||
doc, _, e := parser.DumpAST(file, nil)
|
||||
if e == nil {
|
||||
os.Stdout.Write(doc)
|
||||
return
|
||||
}
|
||||
err = e
|
||||
} else {
|
||||
doc, _, e := parser.ParseFile(file, 0)
|
||||
if e == nil {
|
||||
enc := json.NewEncoder(os.Stdout)
|
||||
enc.SetIndent("", " ")
|
||||
check(enc.Encode(doc))
|
||||
return
|
||||
}
|
||||
err = e
|
||||
}
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
41
chore/clangpp/clangpp.go
Normal file
41
chore/clangpp/clangpp.go
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2022 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/goplus/llgo/xtool/clang/preprocessor"
|
||||
)
|
||||
|
||||
func usage() {
|
||||
fmt.Fprintf(os.Stderr, "Usage: clangpp source.c\n")
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
usage()
|
||||
return
|
||||
}
|
||||
infile := os.Args[1]
|
||||
outfile := infile + ".i"
|
||||
if err := preprocessor.Do(infile, outfile, nil); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
62
chore/gentests/gentests.go
Normal file
62
chore/gentests/gentests.go
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/goplus/llgo/internal/llgen"
|
||||
"github.com/goplus/llgo/ssa"
|
||||
"github.com/goplus/mod"
|
||||
)
|
||||
|
||||
func main() {
|
||||
dir, _, err := mod.FindGoMod(".")
|
||||
check(err)
|
||||
|
||||
ssa.Initialize(ssa.InitAll | ssa.InitNative)
|
||||
llgen.Verbose = false
|
||||
|
||||
llgenDir(dir + "/cl/_testlibc")
|
||||
llgenDir(dir + "/cl/_testrt")
|
||||
llgenDir(dir + "/cl/_testgo")
|
||||
llgenDir(dir+"/cl/_testpy", "")
|
||||
llgenDir(dir+"/cl/_testdata", "")
|
||||
}
|
||||
|
||||
func llgenDir(dir string, pkgPath ...string) {
|
||||
fis, err := os.ReadDir(dir)
|
||||
check(err)
|
||||
for _, fi := range fis {
|
||||
name := fi.Name()
|
||||
if !fi.IsDir() || strings.HasPrefix(name, "_") {
|
||||
continue
|
||||
}
|
||||
testDir := dir + "/" + name
|
||||
fmt.Fprintln(os.Stderr, "llgen", testDir)
|
||||
os.Chdir(testDir)
|
||||
llgen.SmartDoFile("in.go", pkgPath...)
|
||||
}
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
@@ -19,29 +19,16 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/goplus/llgo/internal/llgen"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Fprintln(os.Stderr, "Usage: llgen xxx.go [pkgPath]")
|
||||
fmt.Fprintln(os.Stderr, "Usage: llgen <pkg> [pkgPath]")
|
||||
return
|
||||
}
|
||||
|
||||
inFile := os.Args[1]
|
||||
|
||||
dir, _ := filepath.Split(inFile)
|
||||
outFile := dir + "out.ll"
|
||||
|
||||
pkgPath := ""
|
||||
if len(os.Args) == 3 {
|
||||
pkgPath = os.Args[2]
|
||||
} else {
|
||||
pkgPath = llgen.PkgPath(dir)
|
||||
}
|
||||
|
||||
llgen.Init()
|
||||
llgen.Do(pkgPath, inFile, outFile)
|
||||
llgen.SmartDoFile(os.Args[1], os.Args[2:]...)
|
||||
}
|
||||
|
||||
249
chore/llpyg/llpyg.go
Normal file
249
chore/llpyg/llpyg.go
Normal file
@@ -0,0 +1,249 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/token"
|
||||
"go/types"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/goplus/gogen"
|
||||
"github.com/goplus/llgo/chore/llpyg/pysig"
|
||||
"github.com/goplus/llgo/ssa"
|
||||
)
|
||||
|
||||
type symbol struct {
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Doc string `json:"doc"`
|
||||
Sig string `json:"sig"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
type module struct {
|
||||
Name string `json:"name"`
|
||||
Items []*symbol `json:"items"`
|
||||
}
|
||||
|
||||
func pydump(pyLib string) (mod module) {
|
||||
var out bytes.Buffer
|
||||
cmd := exec.Command("pydump", pyLib)
|
||||
cmd.Stdout = &out
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Run()
|
||||
|
||||
json.Unmarshal(out.Bytes(), &mod)
|
||||
return
|
||||
}
|
||||
|
||||
func pysigfetch(pyLib string, names []string) (mod module) {
|
||||
var out bytes.Buffer
|
||||
cmd := exec.Command("pysigfetch", pyLib, "-")
|
||||
cmd.Stdin = strings.NewReader(strings.Join(names, " "))
|
||||
cmd.Stdout = &out
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Run()
|
||||
|
||||
json.Unmarshal(out.Bytes(), &mod)
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Fprintln(os.Stderr, "Usage: llpyg <pythonLibPath>")
|
||||
return
|
||||
}
|
||||
pyLib := os.Args[1]
|
||||
|
||||
mod := pydump(pyLib)
|
||||
if mod.Name != pyLib {
|
||||
log.Printf("import module %s failed\n", pyLib)
|
||||
os.Exit(1)
|
||||
}
|
||||
pkg := gogen.NewPackage("", pkgName(pyLib), nil)
|
||||
pkg.Import("unsafe").MarkForceUsed(pkg) // import _ "unsafe"
|
||||
py := pkg.Import("github.com/goplus/llgo/py") // import "github.com/goplus/llgo/py"
|
||||
|
||||
f := func(cb *gogen.CodeBuilder) int {
|
||||
cb.Val("py." + mod.Name)
|
||||
return 1
|
||||
}
|
||||
defs := pkg.NewConstDefs(pkg.Types.Scope())
|
||||
defs.New(f, 0, 0, nil, "LLGoPackage")
|
||||
|
||||
obj := py.Ref("Object").(*types.TypeName).Type().(*types.Named)
|
||||
objPtr := types.NewPointer(obj)
|
||||
ret := types.NewTuple(pkg.NewParam(0, "", objPtr))
|
||||
|
||||
ctx := &context{pkg, obj, objPtr, ret, nil, py}
|
||||
ctx.genMod(pkg, &mod)
|
||||
skips := ctx.skips
|
||||
if n := len(skips); n > 0 {
|
||||
log.Printf("==> There are %d signatures not found, fetch from doc site\n", n)
|
||||
mod = pysigfetch(pyLib, skips)
|
||||
ctx.skips = skips[:0]
|
||||
ctx.genMod(pkg, &mod)
|
||||
if len(mod.Items) > 0 {
|
||||
skips = ctx.skips
|
||||
}
|
||||
if n := len(skips); n > 0 {
|
||||
log.Printf("==> Skip %d symbols:\n%v\n", n, skips)
|
||||
}
|
||||
}
|
||||
|
||||
pkg.WriteTo(os.Stdout)
|
||||
}
|
||||
|
||||
func pkgName(pyLib string) string {
|
||||
if pos := strings.LastIndexByte(pyLib, '.'); pos >= 0 {
|
||||
return pyLib[pos+1:]
|
||||
}
|
||||
return pyLib
|
||||
}
|
||||
|
||||
type context struct {
|
||||
pkg *gogen.Package
|
||||
obj *types.Named
|
||||
objPtr *types.Pointer
|
||||
ret *types.Tuple
|
||||
skips []string
|
||||
py gogen.PkgRef
|
||||
}
|
||||
|
||||
func (ctx *context) genMod(pkg *gogen.Package, mod *module) {
|
||||
for _, sym := range mod.Items {
|
||||
switch sym.Type {
|
||||
case "builtin_function_or_method", "function", "method", "ufunc", "method-wrapper":
|
||||
ctx.genFunc(pkg, sym)
|
||||
case "str", "float", "bool", "type", "dict", "tuple", "list", "object", "module",
|
||||
"int", "set", "frozenset", "flags", "bool_", "pybind11_type", "layout",
|
||||
"memory_format", "qscheme", "dtype", "tensortype", "ellipsis": // skip
|
||||
case "": // pysigfetch: page not found
|
||||
ctx.skips = append(ctx.skips, sym.Name)
|
||||
default:
|
||||
t := sym.Type
|
||||
if len(t) > 0 && (t[0] >= 'a' && t[0] <= 'z') && !strings.HasSuffix(t, "_info") {
|
||||
log.Panicln("unsupport type:", sym.Type)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol) {
|
||||
name, symSig := sym.Name, sym.Sig
|
||||
if len(name) == 0 || name[0] == '_' {
|
||||
return
|
||||
}
|
||||
if symSig == "<NULL>" {
|
||||
ctx.skips = append(ctx.skips, name)
|
||||
return
|
||||
}
|
||||
params, variadic := ctx.genParams(pkg, symSig)
|
||||
name = genName(name, -1)
|
||||
sig := types.NewSignatureType(nil, nil, nil, params, ctx.ret, variadic)
|
||||
fn := pkg.NewFuncDecl(token.NoPos, name, sig)
|
||||
list := ctx.genDoc(sym.Doc)
|
||||
if sym.URL != "" {
|
||||
if len(list) > 0 {
|
||||
list = append(list, emptyCommentLine)
|
||||
}
|
||||
list = append(list, genSee(sym.URL))
|
||||
}
|
||||
if len(list) > 0 {
|
||||
list = append(list, emptyCommentLine)
|
||||
}
|
||||
list = append(list, ctx.genLinkname(name, sym))
|
||||
fn.SetComments(pkg, &ast.CommentGroup{List: list})
|
||||
// fn.BodyStart(pkg).End()
|
||||
}
|
||||
|
||||
func (ctx *context) genParams(pkg *gogen.Package, sig string) (*types.Tuple, bool) {
|
||||
args := pysig.Parse(sig)
|
||||
if len(args) == 0 {
|
||||
return nil, false
|
||||
}
|
||||
n := len(args)
|
||||
objPtr := ctx.objPtr
|
||||
list := make([]*types.Var, 0, n)
|
||||
for i := 0; i < n; i++ {
|
||||
name := args[i].Name
|
||||
if name == "/" {
|
||||
continue
|
||||
}
|
||||
if name == "*" || name == "\\*" {
|
||||
break
|
||||
}
|
||||
if strings.HasPrefix(name, "*") {
|
||||
if name[1] != '*' {
|
||||
list = append(list, ssa.VArg())
|
||||
return types.NewTuple(list...), true
|
||||
}
|
||||
return types.NewTuple(list...), false
|
||||
}
|
||||
list = append(list, pkg.NewParam(0, genName(name, 0), objPtr))
|
||||
}
|
||||
return types.NewTuple(list...), false
|
||||
}
|
||||
|
||||
func genName(name string, idxDontTitle int) string {
|
||||
parts := strings.Split(name, "_")
|
||||
for i, part := range parts {
|
||||
if i != idxDontTitle && part != "" {
|
||||
if c := part[0]; c >= 'a' && c <= 'z' {
|
||||
part = string(c+'A'-'a') + part[1:]
|
||||
}
|
||||
parts[i] = part
|
||||
}
|
||||
}
|
||||
name = strings.Join(parts, "")
|
||||
switch name {
|
||||
case "default", "func", "var", "range", "":
|
||||
name += "_"
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
func (ctx *context) genLinkname(name string, sym *symbol) *ast.Comment {
|
||||
return &ast.Comment{Text: "//go:linkname " + name + " py." + sym.Name}
|
||||
}
|
||||
|
||||
func (ctx *context) genDoc(doc string) []*ast.Comment {
|
||||
if doc == "" {
|
||||
return make([]*ast.Comment, 0, 4)
|
||||
}
|
||||
lines := strings.Split(doc, "\n")
|
||||
list := make([]*ast.Comment, len(lines), len(lines)+4)
|
||||
for i, line := range lines {
|
||||
list[i] = &ast.Comment{Text: "// " + line}
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
func genSee(url string) *ast.Comment {
|
||||
return &ast.Comment{Text: "// See " + url}
|
||||
}
|
||||
|
||||
var (
|
||||
emptyCommentLine = &ast.Comment{Text: "//"}
|
||||
)
|
||||
100
chore/llpyg/pysig/parse.go
Normal file
100
chore/llpyg/pysig/parse.go
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package pysig
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Arg struct {
|
||||
Name string
|
||||
Type string
|
||||
DefVal string
|
||||
}
|
||||
|
||||
// Parse parses a Python function signature.
|
||||
func Parse(sig string) (args []*Arg) {
|
||||
sig = strings.TrimPrefix(sig, "(")
|
||||
for {
|
||||
pos := strings.IndexAny(sig, ",:=)")
|
||||
if pos <= 0 {
|
||||
return
|
||||
}
|
||||
arg := &Arg{Name: strings.TrimSpace(sig[:pos])}
|
||||
args = append(args, arg)
|
||||
c := sig[pos]
|
||||
sig = sig[pos+1:]
|
||||
switch c {
|
||||
case ',':
|
||||
continue
|
||||
case ':':
|
||||
arg.Type, sig = parseType(sig)
|
||||
if strings.HasPrefix(sig, "=") {
|
||||
arg.DefVal, sig = parseDefVal(sig[1:])
|
||||
}
|
||||
case '=':
|
||||
arg.DefVal, sig = parseDefVal(sig)
|
||||
case ')':
|
||||
return
|
||||
}
|
||||
sig = strings.TrimPrefix(sig, ",")
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
allSpecials = "([<'\""
|
||||
)
|
||||
|
||||
var pairStops = map[byte]string{
|
||||
'(': ")" + allSpecials,
|
||||
'[': "]" + allSpecials,
|
||||
'<': ">" + allSpecials,
|
||||
'\'': "'" + allSpecials,
|
||||
'"': "\"",
|
||||
}
|
||||
|
||||
func parseText(sig string, stops string) (left string) {
|
||||
for {
|
||||
pos := strings.IndexAny(sig, stops)
|
||||
if pos < 0 {
|
||||
return sig
|
||||
}
|
||||
if c := sig[pos]; c != stops[0] {
|
||||
if pstop, ok := pairStops[c]; ok {
|
||||
sig = strings.TrimPrefix(parseText(sig[pos+1:], pstop), pstop[:1])
|
||||
continue
|
||||
}
|
||||
}
|
||||
return sig[pos:]
|
||||
}
|
||||
}
|
||||
|
||||
// stops: "=,)"
|
||||
func parseType(sig string) (string, string) {
|
||||
left := parseText(sig, "=,)"+allSpecials)
|
||||
return resultOf(sig, left), left
|
||||
}
|
||||
|
||||
// stops: ",)"
|
||||
func parseDefVal(sig string) (string, string) {
|
||||
left := parseText(sig, ",)"+allSpecials)
|
||||
return resultOf(sig, left), left
|
||||
}
|
||||
|
||||
func resultOf(sig, left string) string {
|
||||
return strings.TrimSpace(sig[:len(sig)-len(left)])
|
||||
}
|
||||
52
chore/llpyg/pysig/parse_test.go
Normal file
52
chore/llpyg/pysig/parse_test.go
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package pysig
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestParse(t *testing.T) {
|
||||
type testCase struct {
|
||||
sig string
|
||||
args []*Arg
|
||||
}
|
||||
cases := []testCase{
|
||||
{"(start=None, *, unit: 'str | None' = None) -> 'TimedeltaIndex'", []*Arg{
|
||||
{Name: "start", DefVal: "None"},
|
||||
{Name: "*"},
|
||||
{Name: "unit", Type: "'str | None'", DefVal: "None"},
|
||||
}},
|
||||
{"()", nil},
|
||||
{"(a =", []*Arg{{Name: "a"}}},
|
||||
{"(a) -> int", []*Arg{{Name: "a"}}},
|
||||
{"(a: int)", []*Arg{{Name: "a", Type: "int"}}},
|
||||
{"(a: int = 1, b: float)", []*Arg{{Name: "a", Type: "int", DefVal: "1"}, {Name: "b", Type: "float"}}},
|
||||
{"(a = <1>, b = 2.0)", []*Arg{{Name: "a", DefVal: "<1>"}, {Name: "b", DefVal: "2.0"}}},
|
||||
{"(a: 'Suffixes' = ('_x', '_y'))", []*Arg{{Name: "a", Type: "'Suffixes'", DefVal: "('_x', '_y')"}}},
|
||||
}
|
||||
for _, c := range cases {
|
||||
args := Parse(c.sig)
|
||||
if len(args) != len(c.args) {
|
||||
t.Fatalf("%s: len(args) = %v, want %v", c.sig, len(args), len(c.args))
|
||||
}
|
||||
for i, arg := range args {
|
||||
want := c.args[i]
|
||||
if arg.Name != want.Name || arg.Type != want.Type || arg.DefVal != want.DefVal {
|
||||
t.Fatalf("%s: args[%v] = %v, want %v", c.sig, i, arg, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
18
chore/llvmtargets/llvm_targets.go
Normal file
18
chore/llvmtargets/llvm_targets.go
Normal file
@@ -0,0 +1,18 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/goplus/llvm"
|
||||
)
|
||||
|
||||
func main() {
|
||||
llvm.InitializeAllTargetInfos()
|
||||
llvm.InitializeAllTargets()
|
||||
llvm.InitializeAllTargetMCs()
|
||||
llvm.InitializeNativeTarget()
|
||||
fmt.Println("targets:")
|
||||
for it := llvm.FirstTarget(); it.C != nil; it = it.NextTarget() {
|
||||
fmt.Printf("- %s: %s\n", it.Name(), it.Description())
|
||||
}
|
||||
}
|
||||
@@ -18,9 +18,10 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/goplus/llgo/x/nm"
|
||||
"github.com/goplus/llgo/xtool/env/llvm"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -29,9 +30,8 @@ func main() {
|
||||
return
|
||||
}
|
||||
|
||||
nm := nm.New("nm")
|
||||
nm := llvm.New().Nm()
|
||||
items, err := nm.List(os.Args[1])
|
||||
check(err)
|
||||
for _, item := range items {
|
||||
if item.File != "" {
|
||||
fmt.Printf("\n%s:\n", item.File)
|
||||
@@ -44,10 +44,7 @@ func main() {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
log.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/goplus/llgo/x/env/llvm"
|
||||
"github.com/goplus/llgo/x/nm"
|
||||
"github.com/goplus/llgo/xtool/env/llvm"
|
||||
"github.com/goplus/llgo/xtool/nm"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -64,6 +64,7 @@ func makeIndex() {
|
||||
usrLib(true),
|
||||
stdLib("LLGO_STDROOT"),
|
||||
stdLib("LLGO_USRROOT"),
|
||||
pythonLib(),
|
||||
}
|
||||
err := b.Index(libDirs, idxDir, func(path string) {
|
||||
fmt.Println("==>", path)
|
||||
@@ -72,6 +73,11 @@ func makeIndex() {
|
||||
}
|
||||
|
||||
func query(q string) {
|
||||
if len(q) > 0 {
|
||||
if c := q[0]; c != '*' && c != '_' {
|
||||
q = "_" + q
|
||||
}
|
||||
}
|
||||
files, err := nm.Query(indexDir(), q)
|
||||
check(err)
|
||||
for _, f := range files {
|
||||
@@ -103,6 +109,10 @@ func usrLib(local bool) string {
|
||||
return "/usr/lib"
|
||||
}
|
||||
|
||||
func pythonLib() string {
|
||||
return os.Getenv("LLGO_PYTHON_ROOT")
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
||||
@@ -3,6 +3,18 @@ source_filename = "apkg"
|
||||
|
||||
@"apkg.init$guard" = global ptr null
|
||||
|
||||
define double @apkg.Max(double %0, double %1) {
|
||||
_llgo_0:
|
||||
%2 = fcmp ogt double %0, %1
|
||||
br i1 %2, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
ret double %0
|
||||
|
||||
_llgo_2: ; preds = %_llgo_0
|
||||
ret double %1
|
||||
}
|
||||
|
||||
define void @apkg.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"apkg.init$guard", align 1
|
||||
@@ -15,15 +27,3 @@ _llgo_1: ; preds = %_llgo_0
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define double @apkg.Max(double %0, double %1) {
|
||||
_llgo_0:
|
||||
%2 = fcmp ogt double %0, %1
|
||||
br i1 %2, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
ret double %0
|
||||
|
||||
_llgo_2: ; preds = %_llgo_0
|
||||
ret double %1
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
@@ -16,6 +18,16 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call i64 @main.max(i64 1, i64 2)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define i64 @main.max(i64 %0, i64 %1) {
|
||||
_llgo_0:
|
||||
%2 = icmp sgt i64 %0, %1
|
||||
@@ -28,9 +40,4 @@ _llgo_2: ; preds = %_llgo_0
|
||||
ret i64 %1
|
||||
}
|
||||
|
||||
define void @main() {
|
||||
_llgo_0:
|
||||
call void @main.init()
|
||||
%0 = call i64 @main.max(i64 1, i64 2)
|
||||
ret void
|
||||
}
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@main.hello = global [7 x i8] undef
|
||||
@"main.init$guard" = global ptr null
|
||||
@main.hello = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
@@ -25,16 +27,21 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main() {
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%0 = call i64 @"github.com/goplus/llgo/cl/internal/stdio.Max"(i64 2, i64 100)
|
||||
%2 = call i64 @"github.com/goplus/llgo/cl/internal/stdio.Max"(i64 2, i64 100)
|
||||
call void (ptr, ...) @printf(ptr @main.hello)
|
||||
ret void
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/cl/internal/stdio.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare i64 @"github.com/goplus/llgo/cl/internal/stdio.Max"(i64, i64)
|
||||
|
||||
declare void @printf(ptr, ...)
|
||||
|
||||
19
cl/_testdata/method/in.go
Normal file
19
cl/_testdata/method/in.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import _ "unsafe"
|
||||
|
||||
type T int
|
||||
|
||||
func (a T) Add(b T) T {
|
||||
return a + b
|
||||
}
|
||||
|
||||
//go:linkname printf C.printf
|
||||
func printf(format *int8, __llgo_va_list ...any)
|
||||
|
||||
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
||||
|
||||
func main() {
|
||||
a := T(1)
|
||||
printf(&format[0], a.Add(2))
|
||||
}
|
||||
58
cl/_testdata/method/out.ll
Normal file
58
cl/_testdata/method/out.ll
Normal file
@@ -0,0 +1,58 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@main.format = global [10 x i8] undef
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define i64 @main.T.Add(i64 %0, i64 %1) {
|
||||
_llgo_0:
|
||||
%2 = add i64 %0, %1
|
||||
ret i64 %2
|
||||
}
|
||||
|
||||
define i64 @"main.(*T).Add"(ptr %0, i64 %1) {
|
||||
_llgo_0:
|
||||
%2 = load i64, ptr %0, align 4
|
||||
%3 = call i64 @main.T.Add(i64 %2, i64 %1)
|
||||
ret i64 %3
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
store i8 72, ptr @main.format, align 1
|
||||
store i8 101, ptr getelementptr inbounds (i8, ptr @main.format, i64 1), align 1
|
||||
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 2), align 1
|
||||
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 3), align 1
|
||||
store i8 111, ptr getelementptr inbounds (i8, ptr @main.format, i64 4), align 1
|
||||
store i8 32, ptr getelementptr inbounds (i8, ptr @main.format, i64 5), align 1
|
||||
store i8 37, ptr getelementptr inbounds (i8, ptr @main.format, i64 6), align 1
|
||||
store i8 100, ptr getelementptr inbounds (i8, ptr @main.format, i64 7), align 1
|
||||
store i8 10, ptr getelementptr inbounds (i8, ptr @main.format, i64 8), align 1
|
||||
store i8 0, ptr getelementptr inbounds (i8, ptr @main.format, i64 9), align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call i64 @main.T.Add(i64 1, i64 2)
|
||||
call void (ptr, ...) @printf(ptr @main.format, i64 %2)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare void @printf(ptr, ...)
|
||||
264
cl/_testdata/print/in.go
Normal file
264
cl/_testdata/print/in.go
Normal file
@@ -0,0 +1,264 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/internal/runtime/c"
|
||||
)
|
||||
|
||||
func gwrite(b []byte) {
|
||||
if len(b) == 0 {
|
||||
return
|
||||
}
|
||||
c.Printf(c.Str("%s"), b)
|
||||
}
|
||||
|
||||
func printbool(v bool) {
|
||||
if v {
|
||||
printstring("true")
|
||||
} else {
|
||||
printstring("false")
|
||||
}
|
||||
}
|
||||
|
||||
func printfloat(v float64) {
|
||||
switch {
|
||||
case v != v:
|
||||
printstring("NaN")
|
||||
return
|
||||
case v+v == v && v > 0:
|
||||
printstring("+Inf")
|
||||
return
|
||||
case v+v == v && v < 0:
|
||||
printstring("-Inf")
|
||||
return
|
||||
}
|
||||
|
||||
const n = 7 // digits printed
|
||||
var buf [n + 7]byte
|
||||
buf[0] = '+'
|
||||
e := 0 // exp
|
||||
if v == 0 {
|
||||
if 1/v < 0 {
|
||||
buf[0] = '-'
|
||||
}
|
||||
} else {
|
||||
if v < 0 {
|
||||
v = -v
|
||||
buf[0] = '-'
|
||||
}
|
||||
|
||||
// normalize
|
||||
for v >= 10 {
|
||||
e++
|
||||
v /= 10
|
||||
}
|
||||
for v < 1 {
|
||||
e--
|
||||
v *= 10
|
||||
}
|
||||
|
||||
// round
|
||||
h := 5.0
|
||||
for i := 0; i < n; i++ {
|
||||
h /= 10
|
||||
}
|
||||
v += h
|
||||
if v >= 10 {
|
||||
e++
|
||||
v /= 10
|
||||
}
|
||||
}
|
||||
|
||||
// format +d.dddd+edd
|
||||
for i := 0; i < n; i++ {
|
||||
s := int(v)
|
||||
buf[i+2] = byte(s + '0')
|
||||
v -= float64(s)
|
||||
v *= 10
|
||||
}
|
||||
buf[1] = buf[2]
|
||||
buf[2] = '.'
|
||||
|
||||
buf[n+2] = 'e'
|
||||
buf[n+3] = '+'
|
||||
if e < 0 {
|
||||
e = -e
|
||||
buf[n+3] = '-'
|
||||
}
|
||||
|
||||
buf[n+4] = byte(e/100) + '0'
|
||||
buf[n+5] = byte(e/10)%10 + '0'
|
||||
buf[n+6] = byte(e%10) + '0'
|
||||
gwrite(buf[:])
|
||||
}
|
||||
|
||||
func printuint(v uint64) {
|
||||
var buf [100]byte
|
||||
i := len(buf)
|
||||
for i--; i > 0; i-- {
|
||||
buf[i] = byte(v%10 + '0')
|
||||
if v < 10 {
|
||||
break
|
||||
}
|
||||
v /= 10
|
||||
}
|
||||
gwrite(buf[i:])
|
||||
}
|
||||
|
||||
func printint(v int64) {
|
||||
if v < 0 {
|
||||
printstring("-")
|
||||
v = -v
|
||||
}
|
||||
printuint(uint64(v))
|
||||
}
|
||||
|
||||
var minhexdigits = 0
|
||||
|
||||
func printhex(v uint64) {
|
||||
const dig = "0123456789abcdef"
|
||||
var buf [100]byte
|
||||
i := len(buf)
|
||||
for i--; i > 0; i-- {
|
||||
buf[i] = dig[v%16]
|
||||
if v < 16 && len(buf)-i >= minhexdigits {
|
||||
break
|
||||
}
|
||||
v /= 16
|
||||
}
|
||||
i--
|
||||
buf[i] = 'x'
|
||||
i--
|
||||
buf[i] = '0'
|
||||
gwrite(buf[i:])
|
||||
}
|
||||
|
||||
func printsp() {
|
||||
printstring(" ")
|
||||
}
|
||||
|
||||
func printnl() {
|
||||
printstring("\n")
|
||||
}
|
||||
|
||||
func printstring(s string) {
|
||||
gwrite(bytes(s))
|
||||
}
|
||||
|
||||
type slice struct {
|
||||
array unsafe.Pointer
|
||||
len int
|
||||
cap int
|
||||
}
|
||||
|
||||
type stringStruct struct {
|
||||
str unsafe.Pointer
|
||||
len int
|
||||
}
|
||||
|
||||
func stringStructOf(sp *string) *stringStruct {
|
||||
return (*stringStruct)(unsafe.Pointer(sp))
|
||||
}
|
||||
|
||||
func bytes(s string) (ret []byte) {
|
||||
rp := (*slice)(unsafe.Pointer(&ret))
|
||||
sp := stringStructOf(&s)
|
||||
rp.array = sp.str
|
||||
rp.len = sp.len
|
||||
rp.cap = sp.len
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
printstring("llgo")
|
||||
printnl()
|
||||
printuint(1024)
|
||||
printnl()
|
||||
printhex(0x1234abcf)
|
||||
printnl()
|
||||
prinxor(1)
|
||||
printnl()
|
||||
prinsub(100)
|
||||
printnl()
|
||||
prinusub(1<<64 - 1)
|
||||
printnl()
|
||||
prinfsub(100.1)
|
||||
printnl()
|
||||
printany(float32(1e9))
|
||||
printnl()
|
||||
printany(float64(2e9))
|
||||
printnl()
|
||||
var b bool = true
|
||||
if b == true && b != false {
|
||||
println("check bool", b)
|
||||
}
|
||||
n1 := 0b1001
|
||||
n2 := 0b0011
|
||||
println("check &^", n1&^n2 == 0b1000, n2&^n1 == 0b0010)
|
||||
println(true, false, 'a', 'A', rune('中'),
|
||||
int8(1), int16(2), int32(3), int64(4), 5,
|
||||
uint8(1), uint16(2), uint32(3), uint64(4), uintptr(5),
|
||||
"llgo")
|
||||
}
|
||||
|
||||
func println(args ...any) {
|
||||
for i, v := range args {
|
||||
if i != 0 {
|
||||
printstring(" ")
|
||||
}
|
||||
printany(v)
|
||||
}
|
||||
printnl()
|
||||
}
|
||||
|
||||
func printany(v any) {
|
||||
switch v := v.(type) {
|
||||
case bool:
|
||||
printbool(v)
|
||||
case int:
|
||||
printint(int64(v))
|
||||
case int8:
|
||||
printint(int64(v))
|
||||
case int16:
|
||||
printint(int64(v))
|
||||
case int32:
|
||||
printint(int64(v))
|
||||
case int64:
|
||||
printint(int64(v))
|
||||
case uint:
|
||||
printuint(uint64(v))
|
||||
case uint8:
|
||||
printuint(uint64(v))
|
||||
case uint16:
|
||||
printuint(uint64(v))
|
||||
case uint32:
|
||||
printuint(uint64(v))
|
||||
case uint64:
|
||||
printuint(uint64(v))
|
||||
case uintptr:
|
||||
printuint(uint64(v))
|
||||
case float32:
|
||||
printfloat(float64(v))
|
||||
case float64:
|
||||
printfloat(float64(v))
|
||||
case string:
|
||||
printstring(v)
|
||||
}
|
||||
}
|
||||
|
||||
func prinxor(n int64) {
|
||||
printint(^n)
|
||||
}
|
||||
|
||||
func prinsub(n int64) {
|
||||
printint(-n)
|
||||
}
|
||||
|
||||
func prinusub(n uint64) {
|
||||
printuint(-n)
|
||||
}
|
||||
|
||||
func prinfsub(n float64) {
|
||||
printfloat(-n)
|
||||
}
|
||||
1576
cl/_testdata/print/out.ll
Normal file
1576
cl/_testdata/print/out.ll
Normal file
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@ package main
|
||||
|
||||
import _ "unsafe"
|
||||
|
||||
//go:linkname printf printf
|
||||
//go:linkname printf C.printf
|
||||
func printf(format *int8, __llgo_va_list ...any)
|
||||
|
||||
var hello = [...]int8{'H', 'e', 'l', 'l', 'o', '\n', 0}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@main.hello = global [7 x i8] undef
|
||||
@"main.init$guard" = global ptr null
|
||||
@main.hello = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
@@ -24,11 +26,16 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @printf(ptr, ...)
|
||||
|
||||
define void @main() {
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
call void (ptr, ...) @printf(ptr @main.hello)
|
||||
ret void
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare void @printf(ptr, ...)
|
||||
|
||||
12
cl/_testdata/printval/in.go
Normal file
12
cl/_testdata/printval/in.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import _ "unsafe"
|
||||
|
||||
//go:linkname printf C.printf
|
||||
func printf(format *int8, __llgo_va_list ...any)
|
||||
|
||||
var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
||||
|
||||
func main() {
|
||||
printf(&format[0], 100)
|
||||
}
|
||||
44
cl/_testdata/printval/out.ll
Normal file
44
cl/_testdata/printval/out.ll
Normal file
@@ -0,0 +1,44 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@main.format = global [10 x i8] undef
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
store i8 72, ptr @main.format, align 1
|
||||
store i8 101, ptr getelementptr inbounds (i8, ptr @main.format, i64 1), align 1
|
||||
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 2), align 1
|
||||
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 3), align 1
|
||||
store i8 111, ptr getelementptr inbounds (i8, ptr @main.format, i64 4), align 1
|
||||
store i8 32, ptr getelementptr inbounds (i8, ptr @main.format, i64 5), align 1
|
||||
store i8 37, ptr getelementptr inbounds (i8, ptr @main.format, i64 6), align 1
|
||||
store i8 100, ptr getelementptr inbounds (i8, ptr @main.format, i64 7), align 1
|
||||
store i8 10, ptr getelementptr inbounds (i8, ptr @main.format, i64 8), align 1
|
||||
store i8 0, ptr getelementptr inbounds (i8, ptr @main.format, i64 9), align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
call void (ptr, ...) @printf(ptr @main.format, i64 100)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare void @printf(ptr, ...)
|
||||
19
cl/_testdata/ptrmthd/in.go
Normal file
19
cl/_testdata/ptrmthd/in.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import _ "unsafe"
|
||||
|
||||
//go:linkname printf C.printf
|
||||
func printf(format *int8, __llgo_va_list ...any)
|
||||
|
||||
type T int8
|
||||
|
||||
func (f *T) Print(v int) {
|
||||
printf((*int8)(f), v)
|
||||
}
|
||||
|
||||
var format = [...]T{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0}
|
||||
|
||||
func main() {
|
||||
f := &format[0]
|
||||
f.Print(100)
|
||||
}
|
||||
50
cl/_testdata/ptrmthd/out.ll
Normal file
50
cl/_testdata/ptrmthd/out.ll
Normal file
@@ -0,0 +1,50 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@main.format = global [10 x i8] undef
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @"main.(*T).Print"(ptr %0, i64 %1) {
|
||||
_llgo_0:
|
||||
call void (ptr, ...) @printf(ptr %0, i64 %1)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
store i8 72, ptr @main.format, align 1
|
||||
store i8 101, ptr getelementptr inbounds (i8, ptr @main.format, i64 1), align 1
|
||||
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 2), align 1
|
||||
store i8 108, ptr getelementptr inbounds (i8, ptr @main.format, i64 3), align 1
|
||||
store i8 111, ptr getelementptr inbounds (i8, ptr @main.format, i64 4), align 1
|
||||
store i8 32, ptr getelementptr inbounds (i8, ptr @main.format, i64 5), align 1
|
||||
store i8 37, ptr getelementptr inbounds (i8, ptr @main.format, i64 6), align 1
|
||||
store i8 100, ptr getelementptr inbounds (i8, ptr @main.format, i64 7), align 1
|
||||
store i8 10, ptr getelementptr inbounds (i8, ptr @main.format, i64 8), align 1
|
||||
store i8 0, ptr getelementptr inbounds (i8, ptr @main.format, i64 9), align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
call void @"main.(*T).Print"(ptr @main.format, i64 100)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @printf(ptr, ...)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
13
cl/_testdata/uint/in.go
Normal file
13
cl/_testdata/uint/in.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import "github.com/goplus/llgo/c"
|
||||
|
||||
func f(a c.Uint) c.Uint {
|
||||
a++
|
||||
return a
|
||||
}
|
||||
|
||||
func main() {
|
||||
var a c.Uint = 100
|
||||
c.Printf(c.Str("Hello, %u\n"), f(a))
|
||||
}
|
||||
41
cl/_testdata/uint/out.ll
Normal file
41
cl/_testdata/uint/out.ll
Normal file
@@ -0,0 +1,41 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@0 = private unnamed_addr constant [11 x i8] c"Hello, %u\0A\00", align 1
|
||||
|
||||
define i32 @main.f(i32 %0) {
|
||||
_llgo_0:
|
||||
%1 = add i32 %0, 1
|
||||
ret i32 %1
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call i32 @main.f(i32 100)
|
||||
%3 = call i32 (ptr, ...) @printf(ptr @0, i32 %2)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
11
cl/_testdata/untyped/in.go
Normal file
11
cl/_testdata/untyped/in.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
const c = 100
|
||||
|
||||
var a float64 = 1
|
||||
|
||||
func main() {
|
||||
if c > 100 {
|
||||
a = 0
|
||||
}
|
||||
}
|
||||
39
cl/_testdata/untyped/out.ll
Normal file
39
cl/_testdata/untyped/out.ll
Normal file
@@ -0,0 +1,39 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@main.a = global ptr null
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
store double 1.000000e+00, ptr @main.a, align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
br i1 false, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store double 0.000000e+00, ptr @main.a, align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
23
cl/_testdata/utf8/in.go
Normal file
23
cl/_testdata/utf8/in.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var str = "中abcd"
|
||||
for i := 0; i < len(str); {
|
||||
r, n := utf8.DecodeRuneInString(str[i:])
|
||||
i += n
|
||||
println(r)
|
||||
}
|
||||
println(index(2) == 3)
|
||||
}
|
||||
|
||||
var array = [...]uint8{
|
||||
1, 2, 3, 4, 5, 6, 7, 8,
|
||||
}
|
||||
|
||||
func index(n int8) uint8 {
|
||||
return array[n]
|
||||
}
|
||||
105
cl/_testdata/utf8/out.ll
Normal file
105
cl/_testdata/utf8/out.ll
Normal file
@@ -0,0 +1,105 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
|
||||
|
||||
@main.array = global [8 x i8] undef
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@0 = private unnamed_addr constant [8 x i8] c"\E4\B8\ADabcd\00", align 1
|
||||
@1 = private unnamed_addr constant [8 x i8] c"\E4\B8\ADabcd\00", align 1
|
||||
|
||||
define i8 @main.index(i8 %0) {
|
||||
_llgo_0:
|
||||
%1 = icmp slt i8 %0, 0
|
||||
call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %1)
|
||||
%2 = zext i8 %0 to i64
|
||||
%3 = getelementptr inbounds i8, ptr @main.array, i64 %2
|
||||
%4 = load i8, ptr %3, align 1
|
||||
ret i8 %4
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"unicode/utf8.init"()
|
||||
store i8 1, ptr @main.array, align 1
|
||||
store i8 2, ptr getelementptr inbounds (i8, ptr @main.array, i64 1), align 1
|
||||
store i8 3, ptr getelementptr inbounds (i8, ptr @main.array, i64 2), align 1
|
||||
store i8 4, ptr getelementptr inbounds (i8, ptr @main.array, i64 3), align 1
|
||||
store i8 5, ptr getelementptr inbounds (i8, ptr @main.array, i64 4), align 1
|
||||
store i8 6, ptr getelementptr inbounds (i8, ptr @main.array, i64 5), align 1
|
||||
store i8 7, ptr getelementptr inbounds (i8, ptr @main.array, i64 6), align 1
|
||||
store i8 8, ptr getelementptr inbounds (i8, ptr @main.array, i64 7), align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_1: ; preds = %_llgo_3
|
||||
%2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0
|
||||
store ptr @0, ptr %3, align 8
|
||||
%4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1
|
||||
store i64 7, ptr %4, align 4
|
||||
%5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8
|
||||
%6 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %5, 1
|
||||
%7 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %5, i64 %15, i64 %6)
|
||||
%8 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"github.com/goplus/llgo/internal/runtime.String" %7)
|
||||
%9 = extractvalue { i32, i64 } %8, 0
|
||||
%10 = extractvalue { i32, i64 } %8, 1
|
||||
%11 = add i64 %15, %10
|
||||
%12 = sext i32 %9 to i64
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %12)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_2: ; preds = %_llgo_3
|
||||
%13 = call i8 @main.index(i8 2)
|
||||
%14 = icmp eq i8 %13, 3
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %14)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
ret i32 0
|
||||
|
||||
_llgo_3: ; preds = %_llgo_1, %_llgo_0
|
||||
%15 = phi i64 [ 0, %_llgo_0 ], [ %11, %_llgo_1 ]
|
||||
%16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0
|
||||
store ptr @1, ptr %17, align 8
|
||||
%18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1
|
||||
store i64 7, ptr %18, align 4
|
||||
%19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8
|
||||
%20 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %19, 1
|
||||
%21 = icmp slt i64 %15, %20
|
||||
br i1 %21, label %_llgo_1, label %_llgo_2
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1)
|
||||
|
||||
declare void @"unicode/utf8.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String", i64, i64)
|
||||
|
||||
declare { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"github.com/goplus/llgo/internal/runtime.String")
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1)
|
||||
13
cl/_testdata/vargs/in.go
Normal file
13
cl/_testdata/vargs/in.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import "github.com/goplus/llgo/internal/runtime/c"
|
||||
|
||||
func test(a ...any) {
|
||||
for _, v := range a {
|
||||
c.Printf(c.Str("%d\n"), v.(int))
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
test(1, 2, 3)
|
||||
}
|
||||
142
cl/_testdata/vargs/out.ll
Normal file
142
cl/_testdata/vargs/out.ll
Normal file
@@ -0,0 +1,142 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
|
||||
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
|
||||
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@_llgo_int = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
|
||||
@1 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"main.init$abi"()
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 48)
|
||||
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i64 0
|
||||
%4 = load ptr, ptr @_llgo_int, align 8
|
||||
%5 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %5, i32 0, i32 0
|
||||
store ptr %4, ptr %6, align 8
|
||||
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %5, i32 0, i32 1
|
||||
store ptr inttoptr (i64 1 to ptr), ptr %7, align 8
|
||||
%8 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %5, align 8
|
||||
store %"github.com/goplus/llgo/internal/runtime.eface" %8, ptr %3, align 8
|
||||
%9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i64 1
|
||||
%10 = load ptr, ptr @_llgo_int, align 8
|
||||
%11 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, i32 0, i32 0
|
||||
store ptr %10, ptr %12, align 8
|
||||
%13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, i32 0, i32 1
|
||||
store ptr inttoptr (i64 2 to ptr), ptr %13, align 8
|
||||
%14 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, align 8
|
||||
store %"github.com/goplus/llgo/internal/runtime.eface" %14, ptr %9, align 8
|
||||
%15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i64 2
|
||||
%16 = load ptr, ptr @_llgo_int, align 8
|
||||
%17 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %17, i32 0, i32 0
|
||||
store ptr %16, ptr %18, align 8
|
||||
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %17, i32 0, i32 1
|
||||
store ptr inttoptr (i64 3 to ptr), ptr %19, align 8
|
||||
%20 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %17, align 8
|
||||
store %"github.com/goplus/llgo/internal/runtime.eface" %20, ptr %15, align 8
|
||||
%21 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %21, i32 0, i32 0
|
||||
store ptr %2, ptr %22, align 8
|
||||
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %21, i32 0, i32 1
|
||||
store i64 3, ptr %23, align 4
|
||||
%24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %21, i32 0, i32 2
|
||||
store i64 3, ptr %24, align 4
|
||||
%25 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %21, align 8
|
||||
call void @main.test(%"github.com/goplus/llgo/internal/runtime.Slice" %25)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define void @main.test(%"github.com/goplus/llgo/internal/runtime.Slice" %0) {
|
||||
_llgo_0:
|
||||
%1 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1
|
||||
br label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_4, %_llgo_0
|
||||
%2 = phi i64 [ -1, %_llgo_0 ], [ %3, %_llgo_4 ]
|
||||
%3 = add i64 %2, 1
|
||||
%4 = icmp slt i64 %3, %1
|
||||
br i1 %4, label %_llgo_2, label %_llgo_3
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1
|
||||
%5 = icmp slt i64 %3, 0
|
||||
call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %5)
|
||||
%6 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0
|
||||
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %6, i64 %3
|
||||
%8 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, align 8
|
||||
%9 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %8, 0
|
||||
%10 = load ptr, ptr @_llgo_int, align 8
|
||||
%11 = icmp eq ptr %9, %10
|
||||
br i1 %11, label %_llgo_4, label %_llgo_5
|
||||
|
||||
_llgo_3: ; preds = %_llgo_1
|
||||
ret void
|
||||
|
||||
_llgo_4: ; preds = %_llgo_2
|
||||
%12 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %8, 1
|
||||
%13 = ptrtoint ptr %12 to i64
|
||||
%14 = call i32 (ptr, ...) @printf(ptr @0, i64 %13)
|
||||
br label %_llgo_1
|
||||
|
||||
_llgo_5: ; preds = %_llgo_2
|
||||
%15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0
|
||||
store ptr @1, ptr %16, align 8
|
||||
%17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1
|
||||
store i64 21, ptr %17, align 4
|
||||
%18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.String" %18)
|
||||
unreachable
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
|
||||
|
||||
define void @"main.init$abi"() {
|
||||
_llgo_0:
|
||||
%0 = load ptr, ptr @_llgo_int, align 8
|
||||
%1 = icmp eq ptr %0, null
|
||||
br i1 %1, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
|
||||
store ptr %2, ptr @_llgo_int, align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface")
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
@@ -1,8 +1,10 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@main.a = global ptr null
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
@@ -18,12 +20,17 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main() {
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%0 = load i64, ptr @main.a, align 4
|
||||
%1 = add i64 %0, 1
|
||||
store i64 %1, ptr @main.a, align 4
|
||||
%2 = load i64, ptr @main.a, align 4
|
||||
ret void
|
||||
%3 = add i64 %2, 1
|
||||
store i64 %3, ptr @main.a, align 4
|
||||
%4 = load i64, ptr @main.a, align 4
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
49
cl/_testgo/eface/in.go
Normal file
49
cl/_testgo/eface/in.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/internal/abi"
|
||||
)
|
||||
|
||||
type eface struct {
|
||||
_type *abi.Type
|
||||
data unsafe.Pointer
|
||||
}
|
||||
|
||||
func main() {
|
||||
dump(true)
|
||||
dump(0)
|
||||
dump(int8(0))
|
||||
dump(int16(0))
|
||||
dump(int32(0))
|
||||
dump(int64(0))
|
||||
dump(uint(0))
|
||||
dump(uint8(0))
|
||||
dump(uint16(0))
|
||||
dump(uint32(0))
|
||||
dump(uint64(0))
|
||||
dump(uintptr(0))
|
||||
dump(float32(0))
|
||||
dump(float64(0))
|
||||
dump([10]int{})
|
||||
dump(func() {})
|
||||
dump((*int)(nil))
|
||||
dump([]int{})
|
||||
dump("hello")
|
||||
dump(struct {
|
||||
x int8
|
||||
y int
|
||||
z int
|
||||
}{})
|
||||
}
|
||||
|
||||
func dump(v any) {
|
||||
e := (*eface)(unsafe.Pointer(&v))
|
||||
dumpTyp(e._type, "")
|
||||
}
|
||||
|
||||
func dumpTyp(t *abi.Type, sep string) {
|
||||
print(sep)
|
||||
println(t.Kind(), t.Size_, t.PtrBytes, t.Hash, t.TFlag, t.Align_)
|
||||
}
|
||||
613
cl/_testgo/eface/out.ll
Normal file
613
cl/_testgo/eface/out.ll
Normal file
@@ -0,0 +1,613 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
|
||||
%main.eface = type { ptr, ptr }
|
||||
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
|
||||
%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/internal/runtime.String", ptr }
|
||||
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
|
||||
%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@_llgo_bool = linkonce global ptr null
|
||||
@_llgo_int = linkonce global ptr null
|
||||
@_llgo_int8 = linkonce global ptr null
|
||||
@_llgo_int16 = linkonce global ptr null
|
||||
@_llgo_int32 = linkonce global ptr null
|
||||
@_llgo_int64 = linkonce global ptr null
|
||||
@_llgo_uint = linkonce global ptr null
|
||||
@_llgo_uint8 = linkonce global ptr null
|
||||
@_llgo_uint16 = linkonce global ptr null
|
||||
@_llgo_uint32 = linkonce global ptr null
|
||||
@_llgo_uint64 = linkonce global ptr null
|
||||
@_llgo_uintptr = linkonce global ptr null
|
||||
@_llgo_float32 = linkonce global ptr null
|
||||
@_llgo_float64 = linkonce global ptr null
|
||||
@"[10]_llgo_int" = linkonce global ptr null
|
||||
@"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac" = linkonce global ptr null
|
||||
@"*_llgo_int" = linkonce global ptr null
|
||||
@"[]_llgo_int" = linkonce global ptr null
|
||||
@1 = private unnamed_addr constant [6 x i8] c"hello\00", align 1
|
||||
@_llgo_string = linkonce global ptr null
|
||||
@"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM" = global ptr null
|
||||
@2 = private unnamed_addr constant [2 x i8] c"x\00", align 1
|
||||
@3 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@4 = private unnamed_addr constant [2 x i8] c"y\00", align 1
|
||||
@5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@6 = private unnamed_addr constant [2 x i8] c"z\00", align 1
|
||||
@7 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@8 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
|
||||
define void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %0) {
|
||||
_llgo_0:
|
||||
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16)
|
||||
store %"github.com/goplus/llgo/internal/runtime.eface" %0, ptr %1, align 8
|
||||
%2 = getelementptr inbounds %main.eface, ptr %1, i32 0, i32 0
|
||||
%3 = load ptr, ptr %2, align 8
|
||||
%4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0
|
||||
store ptr @0, ptr %5, align 8
|
||||
%6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1
|
||||
store i64 0, ptr %6, align 4
|
||||
%7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8
|
||||
call void @main.dumpTyp(ptr %3, %"github.com/goplus/llgo/internal/runtime.String" %7)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main.dumpTyp(ptr %0, %"github.com/goplus/llgo/internal/runtime.String" %1) {
|
||||
_llgo_0:
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %1)
|
||||
%2 = call i64 @"github.com/goplus/llgo/internal/abi.(*Type).Kind"(ptr %0)
|
||||
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 0
|
||||
%4 = load i64, ptr %3, align 4
|
||||
%5 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 1
|
||||
%6 = load i64, ptr %5, align 4
|
||||
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 2
|
||||
%8 = load i32, ptr %7, align 4
|
||||
%9 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 3
|
||||
%10 = load i8, ptr %9, align 1
|
||||
%11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 4
|
||||
%12 = load i8, ptr %11, align 1
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %2)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %4)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %6)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
%13 = zext i32 %8 to i64
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %13)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
%14 = zext i8 %10 to i64
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %14)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
%15 = zext i8 %12 to i64
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %15)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/internal/abi.init"()
|
||||
call void @"main.init$abi"()
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = load ptr, ptr @_llgo_bool, align 8
|
||||
%3 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %3, i32 0, i32 0
|
||||
store ptr %2, ptr %4, align 8
|
||||
%5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %3, i32 0, i32 1
|
||||
store ptr inttoptr (i64 -1 to ptr), ptr %5, align 8
|
||||
%6 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %3, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %6)
|
||||
%7 = load ptr, ptr @_llgo_int, align 8
|
||||
%8 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, i32 0, i32 0
|
||||
store ptr %7, ptr %9, align 8
|
||||
%10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, i32 0, i32 1
|
||||
store ptr null, ptr %10, align 8
|
||||
%11 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %11)
|
||||
%12 = load ptr, ptr @_llgo_int8, align 8
|
||||
%13 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, i32 0, i32 0
|
||||
store ptr %12, ptr %14, align 8
|
||||
%15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, i32 0, i32 1
|
||||
store ptr null, ptr %15, align 8
|
||||
%16 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %16)
|
||||
%17 = load ptr, ptr @_llgo_int16, align 8
|
||||
%18 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %18, i32 0, i32 0
|
||||
store ptr %17, ptr %19, align 8
|
||||
%20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %18, i32 0, i32 1
|
||||
store ptr null, ptr %20, align 8
|
||||
%21 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %18, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %21)
|
||||
%22 = load ptr, ptr @_llgo_int32, align 8
|
||||
%23 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %23, i32 0, i32 0
|
||||
store ptr %22, ptr %24, align 8
|
||||
%25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %23, i32 0, i32 1
|
||||
store ptr null, ptr %25, align 8
|
||||
%26 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %23, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %26)
|
||||
%27 = load ptr, ptr @_llgo_int64, align 8
|
||||
%28 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %28, i32 0, i32 0
|
||||
store ptr %27, ptr %29, align 8
|
||||
%30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %28, i32 0, i32 1
|
||||
store ptr null, ptr %30, align 8
|
||||
%31 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %28, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %31)
|
||||
%32 = load ptr, ptr @_llgo_uint, align 8
|
||||
%33 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %33, i32 0, i32 0
|
||||
store ptr %32, ptr %34, align 8
|
||||
%35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %33, i32 0, i32 1
|
||||
store ptr null, ptr %35, align 8
|
||||
%36 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %33, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %36)
|
||||
%37 = load ptr, ptr @_llgo_uint8, align 8
|
||||
%38 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %38, i32 0, i32 0
|
||||
store ptr %37, ptr %39, align 8
|
||||
%40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %38, i32 0, i32 1
|
||||
store ptr null, ptr %40, align 8
|
||||
%41 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %38, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %41)
|
||||
%42 = load ptr, ptr @_llgo_uint16, align 8
|
||||
%43 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %43, i32 0, i32 0
|
||||
store ptr %42, ptr %44, align 8
|
||||
%45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %43, i32 0, i32 1
|
||||
store ptr null, ptr %45, align 8
|
||||
%46 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %43, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %46)
|
||||
%47 = load ptr, ptr @_llgo_uint32, align 8
|
||||
%48 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %48, i32 0, i32 0
|
||||
store ptr %47, ptr %49, align 8
|
||||
%50 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %48, i32 0, i32 1
|
||||
store ptr null, ptr %50, align 8
|
||||
%51 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %48, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %51)
|
||||
%52 = load ptr, ptr @_llgo_uint64, align 8
|
||||
%53 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%54 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, i32 0, i32 0
|
||||
store ptr %52, ptr %54, align 8
|
||||
%55 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, i32 0, i32 1
|
||||
store ptr null, ptr %55, align 8
|
||||
%56 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %56)
|
||||
%57 = load ptr, ptr @_llgo_uintptr, align 8
|
||||
%58 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %58, i32 0, i32 0
|
||||
store ptr %57, ptr %59, align 8
|
||||
%60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %58, i32 0, i32 1
|
||||
store ptr null, ptr %60, align 8
|
||||
%61 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %58, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %61)
|
||||
%62 = load ptr, ptr @_llgo_float32, align 8
|
||||
%63 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%64 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %63, i32 0, i32 0
|
||||
store ptr %62, ptr %64, align 8
|
||||
%65 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %63, i32 0, i32 1
|
||||
store ptr null, ptr %65, align 8
|
||||
%66 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %63, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %66)
|
||||
%67 = load ptr, ptr @_llgo_float64, align 8
|
||||
%68 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i32 0, i32 0
|
||||
store ptr %67, ptr %69, align 8
|
||||
%70 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i32 0, i32 1
|
||||
store ptr null, ptr %70, align 8
|
||||
%71 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %71)
|
||||
%72 = load ptr, ptr @"[10]_llgo_int", align 8
|
||||
%73 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 80)
|
||||
store [10 x i64] zeroinitializer, ptr %73, align 4
|
||||
%74 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%75 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %74, i32 0, i32 0
|
||||
store ptr %72, ptr %75, align 8
|
||||
%76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %74, i32 0, i32 1
|
||||
store ptr %73, ptr %76, align 8
|
||||
%77 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %74, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %77)
|
||||
%78 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8
|
||||
%79 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%80 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %79, i32 0, i32 0
|
||||
store ptr %78, ptr %80, align 8
|
||||
%81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %79, i32 0, i32 1
|
||||
store ptr @"main.main$1", ptr %81, align 8
|
||||
%82 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %79, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %82)
|
||||
%83 = load ptr, ptr @"*_llgo_int", align 8
|
||||
%84 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %84, i32 0, i32 0
|
||||
store ptr %83, ptr %85, align 8
|
||||
%86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %84, i32 0, i32 1
|
||||
store ptr null, ptr %86, align 8
|
||||
%87 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %84, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %87)
|
||||
%88 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 0)
|
||||
%89 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %89, i32 0, i32 0
|
||||
store ptr %88, ptr %90, align 8
|
||||
%91 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %89, i32 0, i32 1
|
||||
store i64 0, ptr %91, align 4
|
||||
%92 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %89, i32 0, i32 2
|
||||
store i64 0, ptr %92, align 4
|
||||
%93 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %89, align 8
|
||||
%94 = load ptr, ptr @"[]_llgo_int", align 8
|
||||
%95 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24)
|
||||
store %"github.com/goplus/llgo/internal/runtime.Slice" %93, ptr %95, align 8
|
||||
%96 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%97 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %96, i32 0, i32 0
|
||||
store ptr %94, ptr %97, align 8
|
||||
%98 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %96, i32 0, i32 1
|
||||
store ptr %95, ptr %98, align 8
|
||||
%99 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %96, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %99)
|
||||
%100 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%101 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %100, i32 0, i32 0
|
||||
store ptr @1, ptr %101, align 8
|
||||
%102 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %100, i32 0, i32 1
|
||||
store i64 5, ptr %102, align 4
|
||||
%103 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %100, align 8
|
||||
%104 = load ptr, ptr @_llgo_string, align 8
|
||||
%105 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
|
||||
store %"github.com/goplus/llgo/internal/runtime.String" %103, ptr %105, align 8
|
||||
%106 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%107 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %106, i32 0, i32 0
|
||||
store ptr %104, ptr %107, align 8
|
||||
%108 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %106, i32 0, i32 1
|
||||
store ptr %105, ptr %108, align 8
|
||||
%109 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %106, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %109)
|
||||
%110 = load ptr, ptr @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", align 8
|
||||
%111 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24)
|
||||
store { i8, i64, i64 } zeroinitializer, ptr %111, align 4
|
||||
%112 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%113 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %112, i32 0, i32 0
|
||||
store ptr %110, ptr %113, align 8
|
||||
%114 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %112, i32 0, i32 1
|
||||
store ptr %111, ptr %114, align 8
|
||||
%115 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %112, align 8
|
||||
call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %115)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
|
||||
|
||||
declare i64 @"github.com/goplus/llgo/internal/abi.(*Type).Kind"(ptr)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/abi.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
define void @"main.init$abi"() {
|
||||
_llgo_0:
|
||||
%0 = load ptr, ptr @_llgo_bool, align 8
|
||||
%1 = icmp eq ptr %0, null
|
||||
br i1 %1, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1)
|
||||
store ptr %2, ptr @_llgo_bool, align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
%3 = load ptr, ptr @_llgo_int, align 8
|
||||
%4 = icmp eq ptr %3, null
|
||||
br i1 %4, label %_llgo_3, label %_llgo_4
|
||||
|
||||
_llgo_3: ; preds = %_llgo_2
|
||||
%5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
|
||||
store ptr %5, ptr @_llgo_int, align 8
|
||||
br label %_llgo_4
|
||||
|
||||
_llgo_4: ; preds = %_llgo_3, %_llgo_2
|
||||
%6 = load ptr, ptr @_llgo_int8, align 8
|
||||
%7 = icmp eq ptr %6, null
|
||||
br i1 %7, label %_llgo_5, label %_llgo_6
|
||||
|
||||
_llgo_5: ; preds = %_llgo_4
|
||||
%8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3)
|
||||
store ptr %8, ptr @_llgo_int8, align 8
|
||||
br label %_llgo_6
|
||||
|
||||
_llgo_6: ; preds = %_llgo_5, %_llgo_4
|
||||
%9 = load ptr, ptr @_llgo_int16, align 8
|
||||
%10 = icmp eq ptr %9, null
|
||||
br i1 %10, label %_llgo_7, label %_llgo_8
|
||||
|
||||
_llgo_7: ; preds = %_llgo_6
|
||||
%11 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4)
|
||||
store ptr %11, ptr @_llgo_int16, align 8
|
||||
br label %_llgo_8
|
||||
|
||||
_llgo_8: ; preds = %_llgo_7, %_llgo_6
|
||||
%12 = load ptr, ptr @_llgo_int32, align 8
|
||||
%13 = icmp eq ptr %12, null
|
||||
br i1 %13, label %_llgo_9, label %_llgo_10
|
||||
|
||||
_llgo_9: ; preds = %_llgo_8
|
||||
%14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5)
|
||||
store ptr %14, ptr @_llgo_int32, align 8
|
||||
br label %_llgo_10
|
||||
|
||||
_llgo_10: ; preds = %_llgo_9, %_llgo_8
|
||||
%15 = load ptr, ptr @_llgo_int64, align 8
|
||||
%16 = icmp eq ptr %15, null
|
||||
br i1 %16, label %_llgo_11, label %_llgo_12
|
||||
|
||||
_llgo_11: ; preds = %_llgo_10
|
||||
%17 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6)
|
||||
store ptr %17, ptr @_llgo_int64, align 8
|
||||
br label %_llgo_12
|
||||
|
||||
_llgo_12: ; preds = %_llgo_11, %_llgo_10
|
||||
%18 = load ptr, ptr @_llgo_uint, align 8
|
||||
%19 = icmp eq ptr %18, null
|
||||
br i1 %19, label %_llgo_13, label %_llgo_14
|
||||
|
||||
_llgo_13: ; preds = %_llgo_12
|
||||
%20 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 7)
|
||||
store ptr %20, ptr @_llgo_uint, align 8
|
||||
br label %_llgo_14
|
||||
|
||||
_llgo_14: ; preds = %_llgo_13, %_llgo_12
|
||||
%21 = load ptr, ptr @_llgo_uint8, align 8
|
||||
%22 = icmp eq ptr %21, null
|
||||
br i1 %22, label %_llgo_15, label %_llgo_16
|
||||
|
||||
_llgo_15: ; preds = %_llgo_14
|
||||
%23 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8)
|
||||
store ptr %23, ptr @_llgo_uint8, align 8
|
||||
br label %_llgo_16
|
||||
|
||||
_llgo_16: ; preds = %_llgo_15, %_llgo_14
|
||||
%24 = load ptr, ptr @_llgo_uint16, align 8
|
||||
%25 = icmp eq ptr %24, null
|
||||
br i1 %25, label %_llgo_17, label %_llgo_18
|
||||
|
||||
_llgo_17: ; preds = %_llgo_16
|
||||
%26 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9)
|
||||
store ptr %26, ptr @_llgo_uint16, align 8
|
||||
br label %_llgo_18
|
||||
|
||||
_llgo_18: ; preds = %_llgo_17, %_llgo_16
|
||||
%27 = load ptr, ptr @_llgo_uint32, align 8
|
||||
%28 = icmp eq ptr %27, null
|
||||
br i1 %28, label %_llgo_19, label %_llgo_20
|
||||
|
||||
_llgo_19: ; preds = %_llgo_18
|
||||
%29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10)
|
||||
store ptr %29, ptr @_llgo_uint32, align 8
|
||||
br label %_llgo_20
|
||||
|
||||
_llgo_20: ; preds = %_llgo_19, %_llgo_18
|
||||
%30 = load ptr, ptr @_llgo_uint64, align 8
|
||||
%31 = icmp eq ptr %30, null
|
||||
br i1 %31, label %_llgo_21, label %_llgo_22
|
||||
|
||||
_llgo_21: ; preds = %_llgo_20
|
||||
%32 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11)
|
||||
store ptr %32, ptr @_llgo_uint64, align 8
|
||||
br label %_llgo_22
|
||||
|
||||
_llgo_22: ; preds = %_llgo_21, %_llgo_20
|
||||
%33 = load ptr, ptr @_llgo_uintptr, align 8
|
||||
%34 = icmp eq ptr %33, null
|
||||
br i1 %34, label %_llgo_23, label %_llgo_24
|
||||
|
||||
_llgo_23: ; preds = %_llgo_22
|
||||
%35 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12)
|
||||
store ptr %35, ptr @_llgo_uintptr, align 8
|
||||
br label %_llgo_24
|
||||
|
||||
_llgo_24: ; preds = %_llgo_23, %_llgo_22
|
||||
%36 = load ptr, ptr @_llgo_float32, align 8
|
||||
%37 = icmp eq ptr %36, null
|
||||
br i1 %37, label %_llgo_25, label %_llgo_26
|
||||
|
||||
_llgo_25: ; preds = %_llgo_24
|
||||
%38 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13)
|
||||
store ptr %38, ptr @_llgo_float32, align 8
|
||||
br label %_llgo_26
|
||||
|
||||
_llgo_26: ; preds = %_llgo_25, %_llgo_24
|
||||
%39 = load ptr, ptr @_llgo_float64, align 8
|
||||
%40 = icmp eq ptr %39, null
|
||||
br i1 %40, label %_llgo_27, label %_llgo_28
|
||||
|
||||
_llgo_27: ; preds = %_llgo_26
|
||||
%41 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14)
|
||||
store ptr %41, ptr @_llgo_float64, align 8
|
||||
br label %_llgo_28
|
||||
|
||||
_llgo_28: ; preds = %_llgo_27, %_llgo_26
|
||||
%42 = load ptr, ptr @_llgo_int, align 8
|
||||
%43 = load ptr, ptr @"[10]_llgo_int", align 8
|
||||
%44 = icmp eq ptr %43, null
|
||||
br i1 %44, label %_llgo_29, label %_llgo_30
|
||||
|
||||
_llgo_29: ; preds = %_llgo_28
|
||||
%45 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 10, ptr %42)
|
||||
store ptr %45, ptr @"[10]_llgo_int", align 8
|
||||
br label %_llgo_30
|
||||
|
||||
_llgo_30: ; preds = %_llgo_29, %_llgo_28
|
||||
%46 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8
|
||||
%47 = icmp eq ptr %46, null
|
||||
br i1 %47, label %_llgo_31, label %_llgo_32
|
||||
|
||||
_llgo_31: ; preds = %_llgo_30
|
||||
%48 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
|
||||
%49 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%50 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, i32 0, i32 0
|
||||
store ptr %48, ptr %50, align 8
|
||||
%51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, i32 0, i32 1
|
||||
store i64 0, ptr %51, align 4
|
||||
%52 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, i32 0, i32 2
|
||||
store i64 0, ptr %52, align 4
|
||||
%53 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, align 8
|
||||
%54 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
|
||||
%55 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, i32 0, i32 0
|
||||
store ptr %54, ptr %56, align 8
|
||||
%57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, i32 0, i32 1
|
||||
store i64 0, ptr %57, align 4
|
||||
%58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, i32 0, i32 2
|
||||
store i64 0, ptr %58, align 4
|
||||
%59 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, align 8
|
||||
%60 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %53, %"github.com/goplus/llgo/internal/runtime.Slice" %59, i1 false)
|
||||
store ptr %60, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8
|
||||
br label %_llgo_32
|
||||
|
||||
_llgo_32: ; preds = %_llgo_31, %_llgo_30
|
||||
%61 = load ptr, ptr @_llgo_int, align 8
|
||||
%62 = load ptr, ptr @"*_llgo_int", align 8
|
||||
%63 = icmp eq ptr %62, null
|
||||
br i1 %63, label %_llgo_33, label %_llgo_34
|
||||
|
||||
_llgo_33: ; preds = %_llgo_32
|
||||
%64 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %61)
|
||||
store ptr %64, ptr @"*_llgo_int", align 8
|
||||
br label %_llgo_34
|
||||
|
||||
_llgo_34: ; preds = %_llgo_33, %_llgo_32
|
||||
%65 = load ptr, ptr @_llgo_int, align 8
|
||||
%66 = load ptr, ptr @"[]_llgo_int", align 8
|
||||
%67 = icmp eq ptr %66, null
|
||||
br i1 %67, label %_llgo_35, label %_llgo_36
|
||||
|
||||
_llgo_35: ; preds = %_llgo_34
|
||||
%68 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceOf"(ptr %65)
|
||||
store ptr %68, ptr @"[]_llgo_int", align 8
|
||||
br label %_llgo_36
|
||||
|
||||
_llgo_36: ; preds = %_llgo_35, %_llgo_34
|
||||
%69 = load ptr, ptr @_llgo_string, align 8
|
||||
%70 = icmp eq ptr %69, null
|
||||
br i1 %70, label %_llgo_37, label %_llgo_38
|
||||
|
||||
_llgo_37: ; preds = %_llgo_36
|
||||
%71 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
|
||||
store ptr %71, ptr @_llgo_string, align 8
|
||||
br label %_llgo_38
|
||||
|
||||
_llgo_38: ; preds = %_llgo_37, %_llgo_36
|
||||
%72 = load ptr, ptr @_llgo_int8, align 8
|
||||
%73 = load ptr, ptr @_llgo_int, align 8
|
||||
%74 = load ptr, ptr @_llgo_int, align 8
|
||||
%75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0
|
||||
store ptr @2, ptr %76, align 8
|
||||
%77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1
|
||||
store i64 1, ptr %77, align 4
|
||||
%78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8
|
||||
%79 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%80 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %79, i32 0, i32 0
|
||||
store ptr @3, ptr %80, align 8
|
||||
%81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %79, i32 0, i32 1
|
||||
store i64 0, ptr %81, align 4
|
||||
%82 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %79, align 8
|
||||
%83 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %78, ptr %72, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %82, i1 false)
|
||||
%84 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %84, i32 0, i32 0
|
||||
store ptr @4, ptr %85, align 8
|
||||
%86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %84, i32 0, i32 1
|
||||
store i64 1, ptr %86, align 4
|
||||
%87 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %84, align 8
|
||||
%88 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%89 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %88, i32 0, i32 0
|
||||
store ptr @5, ptr %89, align 8
|
||||
%90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %88, i32 0, i32 1
|
||||
store i64 0, ptr %90, align 4
|
||||
%91 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %88, align 8
|
||||
%92 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %87, ptr %73, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %91, i1 false)
|
||||
%93 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%94 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 0
|
||||
store ptr @6, ptr %94, align 8
|
||||
%95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 1
|
||||
store i64 1, ptr %95, align 4
|
||||
%96 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %93, align 8
|
||||
%97 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%98 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 0
|
||||
store ptr @7, ptr %98, align 8
|
||||
%99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 1
|
||||
store i64 0, ptr %99, align 4
|
||||
%100 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %97, align 8
|
||||
%101 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %96, ptr %74, i64 16, %"github.com/goplus/llgo/internal/runtime.String" %100, i1 false)
|
||||
%102 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%103 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %102, i32 0, i32 0
|
||||
store ptr @8, ptr %103, align 8
|
||||
%104 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %102, i32 0, i32 1
|
||||
store i64 4, ptr %104, align 4
|
||||
%105 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %102, align 8
|
||||
%106 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 168)
|
||||
%107 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %106, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %83, ptr %107, align 8
|
||||
%108 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %106, i64 1
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %92, ptr %108, align 8
|
||||
%109 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %106, i64 2
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %101, ptr %109, align 8
|
||||
%110 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%111 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, i32 0, i32 0
|
||||
store ptr %106, ptr %111, align 8
|
||||
%112 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, i32 0, i32 1
|
||||
store i64 3, ptr %112, align 4
|
||||
%113 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, i32 0, i32 2
|
||||
store i64 3, ptr %113, align 4
|
||||
%114 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, align 8
|
||||
%115 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %105, i64 24, %"github.com/goplus/llgo/internal/runtime.Slice" %114)
|
||||
store ptr %115, ptr @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64, ptr)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
|
||||
|
||||
define void @"main.main$1"() {
|
||||
_llgo_0:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.SliceOf"(ptr)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1)
|
||||
22
cl/_testgo/errors/in.go
Normal file
22
cl/_testgo/errors/in.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
// New returns an error that formats as the given text.
|
||||
// Each call to New returns a distinct error value even if the text is identical.
|
||||
func New(text string) error {
|
||||
return &errorString{text}
|
||||
}
|
||||
|
||||
// errorString is a trivial implementation of error.
|
||||
type errorString struct {
|
||||
s string
|
||||
}
|
||||
|
||||
func (e *errorString) Error() string {
|
||||
return e.s
|
||||
}
|
||||
|
||||
func main() {
|
||||
err := New("an error")
|
||||
println(err)
|
||||
println(err.Error())
|
||||
}
|
||||
303
cl/_testgo/errors/out.ll
Normal file
303
cl/_testgo/errors/out.ll
Normal file
@@ -0,0 +1,303 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr }
|
||||
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
|
||||
%main.errorString = type { %"github.com/goplus/llgo/internal/runtime.String" }
|
||||
%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
|
||||
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
|
||||
%"github.com/goplus/llgo/internal/abi.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr }
|
||||
%"github.com/goplus/llgo/internal/abi.Imethod" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr }
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@"*_llgo_main.errorString" = global ptr null
|
||||
@_llgo_main.errorString = global ptr null
|
||||
@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null
|
||||
@_llgo_string = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [2 x i8] c"s\00", align 1
|
||||
@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@3 = private unnamed_addr constant [6 x i8] c"Error\00", align 1
|
||||
@"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null
|
||||
@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@5 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1
|
||||
@"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = linkonce global ptr null
|
||||
@6 = private unnamed_addr constant [6 x i8] c"Error\00", align 1
|
||||
@7 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@9 = private unnamed_addr constant [9 x i8] c"an error\00", align 1
|
||||
|
||||
define %"github.com/goplus/llgo/internal/runtime.iface" @main.New(%"github.com/goplus/llgo/internal/runtime.String" %0) {
|
||||
_llgo_0:
|
||||
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16)
|
||||
%2 = getelementptr inbounds %main.errorString, ptr %1, i32 0, i32 0
|
||||
store %"github.com/goplus/llgo/internal/runtime.String" %0, ptr %2, align 8
|
||||
%3 = load ptr, ptr @"*_llgo_main.errorString", align 8
|
||||
%4 = load ptr, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8
|
||||
%5 = call ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr %4, ptr %3)
|
||||
%6 = alloca %"github.com/goplus/llgo/internal/runtime.iface", align 8
|
||||
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, i32 0, i32 0
|
||||
store ptr %5, ptr %7, align 8
|
||||
%8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, i32 0, i32 1
|
||||
store ptr %1, ptr %8, align 8
|
||||
%9 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, align 8
|
||||
ret %"github.com/goplus/llgo/internal/runtime.iface" %9
|
||||
}
|
||||
|
||||
define %"github.com/goplus/llgo/internal/runtime.String" @"main.(*errorString).Error"(ptr %0) {
|
||||
_llgo_0:
|
||||
%1 = getelementptr inbounds %main.errorString, ptr %0, i32 0, i32 0
|
||||
%2 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8
|
||||
ret %"github.com/goplus/llgo/internal/runtime.String" %2
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"main.init$abi"()
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0
|
||||
store ptr @9, ptr %3, align 8
|
||||
%4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1
|
||||
store i64 8, ptr %4, align 4
|
||||
%5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8
|
||||
%6 = call %"github.com/goplus/llgo/internal/runtime.iface" @main.New(%"github.com/goplus/llgo/internal/runtime.String" %5)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface" %6)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
%7 = extractvalue %"github.com/goplus/llgo/internal/runtime.iface" %6, 0
|
||||
%8 = getelementptr ptr, ptr %7, i64 3
|
||||
%9 = load ptr, ptr %8, align 8
|
||||
%10 = extractvalue %"github.com/goplus/llgo/internal/runtime.iface" %6, 1
|
||||
%11 = alloca { ptr, ptr }, align 8
|
||||
%12 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 0
|
||||
store ptr %9, ptr %12, align 8
|
||||
%13 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1
|
||||
store ptr %10, ptr %13, align 8
|
||||
%14 = load { ptr, ptr }, ptr %11, align 8
|
||||
%15 = extractvalue { ptr, ptr } %14, 1
|
||||
%16 = extractvalue { ptr, ptr } %14, 0
|
||||
%17 = call %"github.com/goplus/llgo/internal/runtime.String" %16(ptr %15)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %17)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
|
||||
|
||||
define void @"main.init$abi"() {
|
||||
_llgo_0:
|
||||
%0 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 0, i64 1)
|
||||
store ptr %0, ptr @_llgo_main.errorString, align 8
|
||||
%1 = load ptr, ptr @_llgo_string, align 8
|
||||
%2 = icmp eq ptr %1, null
|
||||
br i1 %2, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%3 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
|
||||
store ptr %3, ptr @_llgo_string, align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
%4 = load ptr, ptr @_llgo_string, align 8
|
||||
%5 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 0
|
||||
store ptr @0, ptr %6, align 8
|
||||
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1
|
||||
store i64 1, ptr %7, align 4
|
||||
%8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8
|
||||
%9 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 0
|
||||
store ptr @1, ptr %10, align 8
|
||||
%11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1
|
||||
store i64 0, ptr %11, align 4
|
||||
%12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8
|
||||
%13 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %8, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %12, i1 false)
|
||||
%14 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %14, i32 0, i32 0
|
||||
store ptr @2, ptr %15, align 8
|
||||
%16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %14, i32 0, i32 1
|
||||
store i64 4, ptr %16, align 4
|
||||
%17 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %14, align 8
|
||||
%18 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56)
|
||||
%19 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %18, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %13, ptr %19, align 8
|
||||
%20 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, i32 0, i32 0
|
||||
store ptr %18, ptr %21, align 8
|
||||
%22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, i32 0, i32 1
|
||||
store i64 1, ptr %22, align 4
|
||||
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, i32 0, i32 2
|
||||
store i64 1, ptr %23, align 4
|
||||
%24 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, align 8
|
||||
%25 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %17, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %24)
|
||||
store ptr %25, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8
|
||||
%26 = load ptr, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8
|
||||
%27 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %27, i32 0, i32 0
|
||||
store ptr @3, ptr %28, align 8
|
||||
%29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %27, i32 0, i32 1
|
||||
store i64 5, ptr %29, align 4
|
||||
%30 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %27, align 8
|
||||
%31 = load ptr, ptr @_llgo_string, align 8
|
||||
%32 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8
|
||||
%33 = icmp eq ptr %32, null
|
||||
br i1 %33, label %_llgo_3, label %_llgo_4
|
||||
|
||||
_llgo_3: ; preds = %_llgo_2
|
||||
%34 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
|
||||
%35 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 0
|
||||
store ptr %34, ptr %36, align 8
|
||||
%37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 1
|
||||
store i64 0, ptr %37, align 4
|
||||
%38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 2
|
||||
store i64 0, ptr %38, align 4
|
||||
%39 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, align 8
|
||||
%40 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8)
|
||||
%41 = getelementptr ptr, ptr %40, i64 0
|
||||
store ptr %31, ptr %41, align 8
|
||||
%42 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 0
|
||||
store ptr %40, ptr %43, align 8
|
||||
%44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 1
|
||||
store i64 1, ptr %44, align 4
|
||||
%45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 2
|
||||
store i64 1, ptr %45, align 4
|
||||
%46 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, align 8
|
||||
%47 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %39, %"github.com/goplus/llgo/internal/runtime.Slice" %46, i1 false)
|
||||
store ptr %47, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8
|
||||
br label %_llgo_4
|
||||
|
||||
_llgo_4: ; preds = %_llgo_3, %_llgo_2
|
||||
%48 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8
|
||||
%49 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8
|
||||
%50 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 0
|
||||
store %"github.com/goplus/llgo/internal/runtime.String" %30, ptr %50, align 8
|
||||
%51 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 1
|
||||
store ptr %48, ptr %51, align 8
|
||||
%52 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 2
|
||||
store ptr @"main.(*errorString).Error", ptr %52, align 8
|
||||
%53 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 3
|
||||
store ptr @"main.(*errorString).Error", ptr %53, align 8
|
||||
%54 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %49, align 8
|
||||
%55 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40)
|
||||
%56 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %55, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.Method" %54, ptr %56, align 8
|
||||
%57 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, i32 0, i32 0
|
||||
store ptr %55, ptr %58, align 8
|
||||
%59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, i32 0, i32 1
|
||||
store i64 1, ptr %59, align 4
|
||||
%60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, i32 0, i32 2
|
||||
store i64 1, ptr %60, align 4
|
||||
%61 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, align 8
|
||||
%62 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%63 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %62, i32 0, i32 0
|
||||
store ptr @4, ptr %63, align 8
|
||||
%64 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %62, i32 0, i32 1
|
||||
store i64 4, ptr %64, align 4
|
||||
%65 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %62, align 8
|
||||
%66 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%67 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 0
|
||||
store ptr @5, ptr %67, align 8
|
||||
%68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 1
|
||||
store i64 16, ptr %68, align 4
|
||||
%69 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %66, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %0, %"github.com/goplus/llgo/internal/runtime.String" %65, %"github.com/goplus/llgo/internal/runtime.String" %69, ptr %26, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %61)
|
||||
%70 = load ptr, ptr @_llgo_main.errorString, align 8
|
||||
%71 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %70)
|
||||
store ptr %71, ptr @"*_llgo_main.errorString", align 8
|
||||
%72 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8
|
||||
%73 = load ptr, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8
|
||||
%74 = icmp eq ptr %73, null
|
||||
br i1 %74, label %_llgo_5, label %_llgo_6
|
||||
|
||||
_llgo_5: ; preds = %_llgo_4
|
||||
%75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0
|
||||
store ptr @6, ptr %76, align 8
|
||||
%77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1
|
||||
store i64 5, ptr %77, align 4
|
||||
%78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8
|
||||
%79 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8
|
||||
%80 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %79, i32 0, i32 0
|
||||
store %"github.com/goplus/llgo/internal/runtime.String" %78, ptr %80, align 8
|
||||
%81 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %79, i32 0, i32 1
|
||||
store ptr %72, ptr %81, align 8
|
||||
%82 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %79, align 8
|
||||
%83 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24)
|
||||
%84 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %83, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.Imethod" %82, ptr %84, align 8
|
||||
%85 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, i32 0, i32 0
|
||||
store ptr %83, ptr %86, align 8
|
||||
%87 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, i32 0, i32 1
|
||||
store i64 1, ptr %87, align 4
|
||||
%88 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, i32 0, i32 2
|
||||
store i64 1, ptr %88, align 4
|
||||
%89 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, align 8
|
||||
%90 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%91 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %90, i32 0, i32 0
|
||||
store ptr @7, ptr %91, align 8
|
||||
%92 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %90, i32 0, i32 1
|
||||
store i64 4, ptr %92, align 4
|
||||
%93 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %90, align 8
|
||||
%94 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %94, i32 0, i32 0
|
||||
store ptr @8, ptr %95, align 8
|
||||
%96 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %94, i32 0, i32 1
|
||||
store i64 0, ptr %96, align 4
|
||||
%97 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %94, align 8
|
||||
%98 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %93, %"github.com/goplus/llgo/internal/runtime.String" %97, %"github.com/goplus/llgo/internal/runtime.Slice" %89)
|
||||
store ptr %98, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8
|
||||
br label %_llgo_6
|
||||
|
||||
_llgo_6: ; preds = %_llgo_5, %_llgo_4
|
||||
ret void
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64, i64, i64)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr, ptr)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface")
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
|
||||
27
cl/_testgo/strucintf/in.go
Normal file
27
cl/_testgo/strucintf/in.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package main
|
||||
|
||||
import "github.com/goplus/llgo/cl/internal/foo"
|
||||
|
||||
func Foo() any {
|
||||
return struct{ v int }{1}
|
||||
}
|
||||
|
||||
func main() {
|
||||
v := Foo()
|
||||
if x, ok := v.(struct{ v int }); ok {
|
||||
println(x.v)
|
||||
} else {
|
||||
println("Foo: not ok")
|
||||
}
|
||||
bar := foo.Bar()
|
||||
if x, ok := bar.(struct{ V int }); ok {
|
||||
println(x.V)
|
||||
} else {
|
||||
println("Bar: not ok")
|
||||
}
|
||||
if x, ok := foo.F().(struct{ v int }); ok {
|
||||
println(x.v)
|
||||
} else {
|
||||
println("F: not ok")
|
||||
}
|
||||
}
|
||||
353
cl/_testgo/strucintf/out.ll
Normal file
353
cl/_testgo/strucintf/out.ll
Normal file
@@ -0,0 +1,353 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
|
||||
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
|
||||
%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
|
||||
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = global ptr null
|
||||
@_llgo_int = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [2 x i8] c"v\00", align 1
|
||||
@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = linkonce global ptr null
|
||||
@3 = private unnamed_addr constant [2 x i8] c"V\00", align 1
|
||||
@4 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@6 = private unnamed_addr constant [12 x i8] c"Foo: not ok\00", align 1
|
||||
@7 = private unnamed_addr constant [12 x i8] c"Bar: not ok\00", align 1
|
||||
@8 = private unnamed_addr constant [10 x i8] c"F: not ok\00", align 1
|
||||
|
||||
define %"github.com/goplus/llgo/internal/runtime.eface" @main.Foo() {
|
||||
_llgo_0:
|
||||
%0 = alloca { i64 }, align 8
|
||||
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %0, i64 8)
|
||||
%2 = getelementptr inbounds { i64 }, ptr %1, i32 0, i32 0
|
||||
store i64 1, ptr %2, align 4
|
||||
%3 = load { i64 }, ptr %1, align 4
|
||||
%4 = load ptr, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8
|
||||
%5 = extractvalue { i64 } %3, 0
|
||||
%6 = inttoptr i64 %5 to ptr
|
||||
%7 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, i32 0, i32 0
|
||||
store ptr %4, ptr %8, align 8
|
||||
%9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, i32 0, i32 1
|
||||
store ptr %6, ptr %9, align 8
|
||||
%10 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, align 8
|
||||
ret %"github.com/goplus/llgo/internal/runtime.eface" %10
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/cl/internal/foo.init"()
|
||||
call void @"main.init$abi"()
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call %"github.com/goplus/llgo/internal/runtime.eface" @main.Foo()
|
||||
%3 = alloca { i64 }, align 8
|
||||
%4 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %3, i64 8)
|
||||
%5 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %2, 0
|
||||
%6 = load ptr, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8
|
||||
%7 = icmp eq ptr %5, %6
|
||||
br i1 %7, label %_llgo_10, label %_llgo_11
|
||||
|
||||
_llgo_1: ; preds = %_llgo_12
|
||||
%8 = getelementptr inbounds { i64 }, ptr %4, i32 0, i32 0
|
||||
%9 = load i64, ptr %8, align 4
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %9)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_3, %_llgo_1
|
||||
%10 = call %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.Bar"()
|
||||
%11 = alloca { i64 }, align 8
|
||||
%12 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %11, i64 8)
|
||||
%13 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 0
|
||||
%14 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8
|
||||
%15 = icmp eq ptr %13, %14
|
||||
br i1 %15, label %_llgo_13, label %_llgo_14
|
||||
|
||||
_llgo_3: ; preds = %_llgo_12
|
||||
%16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0
|
||||
store ptr @6, ptr %17, align 8
|
||||
%18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1
|
||||
store i64 11, ptr %18, align 4
|
||||
%19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %19)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_4: ; preds = %_llgo_15
|
||||
%20 = getelementptr inbounds { i64 }, ptr %12, i32 0, i32 0
|
||||
%21 = load i64, ptr %20, align 4
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %21)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_5
|
||||
|
||||
_llgo_5: ; preds = %_llgo_6, %_llgo_4
|
||||
%22 = alloca { i64 }, align 8
|
||||
%23 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %22, i64 8)
|
||||
%24 = call %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.F"()
|
||||
%25 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 0
|
||||
%26 = load ptr, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8
|
||||
%27 = icmp eq ptr %25, %26
|
||||
br i1 %27, label %_llgo_16, label %_llgo_17
|
||||
|
||||
_llgo_6: ; preds = %_llgo_15
|
||||
%28 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 0
|
||||
store ptr @7, ptr %29, align 8
|
||||
%30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 1
|
||||
store i64 11, ptr %30, align 4
|
||||
%31 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %28, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %31)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_5
|
||||
|
||||
_llgo_7: ; preds = %_llgo_18
|
||||
%32 = getelementptr inbounds { i64 }, ptr %23, i32 0, i32 0
|
||||
%33 = load i64, ptr %32, align 4
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %33)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_8
|
||||
|
||||
_llgo_8: ; preds = %_llgo_9, %_llgo_7
|
||||
ret i32 0
|
||||
|
||||
_llgo_9: ; preds = %_llgo_18
|
||||
%34 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 0
|
||||
store ptr @8, ptr %35, align 8
|
||||
%36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 1
|
||||
store i64 9, ptr %36, align 4
|
||||
%37 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %34, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %37)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
br label %_llgo_8
|
||||
|
||||
_llgo_10: ; preds = %_llgo_0
|
||||
%38 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %2, 1
|
||||
%39 = ptrtoint ptr %38 to i64
|
||||
%40 = alloca { i64 }, align 8
|
||||
%41 = getelementptr inbounds { i64 }, ptr %40, i32 0, i32 0
|
||||
store i64 %39, ptr %41, align 4
|
||||
%42 = load { i64 }, ptr %40, align 4
|
||||
%43 = alloca { { i64 }, i1 }, align 8
|
||||
%44 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 0
|
||||
store { i64 } %42, ptr %44, align 4
|
||||
%45 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 1
|
||||
store i1 true, ptr %45, align 1
|
||||
%46 = load { { i64 }, i1 }, ptr %43, align 4
|
||||
br label %_llgo_12
|
||||
|
||||
_llgo_11: ; preds = %_llgo_0
|
||||
%47 = alloca { { i64 }, i1 }, align 8
|
||||
%48 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 0
|
||||
store { i64 } zeroinitializer, ptr %48, align 4
|
||||
%49 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 1
|
||||
store i1 false, ptr %49, align 1
|
||||
%50 = load { { i64 }, i1 }, ptr %47, align 4
|
||||
br label %_llgo_12
|
||||
|
||||
_llgo_12: ; preds = %_llgo_11, %_llgo_10
|
||||
%51 = phi { { i64 }, i1 } [ %46, %_llgo_10 ], [ %50, %_llgo_11 ]
|
||||
%52 = extractvalue { { i64 }, i1 } %51, 0
|
||||
store { i64 } %52, ptr %4, align 4
|
||||
%53 = extractvalue { { i64 }, i1 } %51, 1
|
||||
br i1 %53, label %_llgo_1, label %_llgo_3
|
||||
|
||||
_llgo_13: ; preds = %_llgo_2
|
||||
%54 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1
|
||||
%55 = ptrtoint ptr %54 to i64
|
||||
%56 = alloca { i64 }, align 8
|
||||
%57 = getelementptr inbounds { i64 }, ptr %56, i32 0, i32 0
|
||||
store i64 %55, ptr %57, align 4
|
||||
%58 = load { i64 }, ptr %56, align 4
|
||||
%59 = alloca { { i64 }, i1 }, align 8
|
||||
%60 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 0
|
||||
store { i64 } %58, ptr %60, align 4
|
||||
%61 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 1
|
||||
store i1 true, ptr %61, align 1
|
||||
%62 = load { { i64 }, i1 }, ptr %59, align 4
|
||||
br label %_llgo_15
|
||||
|
||||
_llgo_14: ; preds = %_llgo_2
|
||||
%63 = alloca { { i64 }, i1 }, align 8
|
||||
%64 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 0
|
||||
store { i64 } zeroinitializer, ptr %64, align 4
|
||||
%65 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 1
|
||||
store i1 false, ptr %65, align 1
|
||||
%66 = load { { i64 }, i1 }, ptr %63, align 4
|
||||
br label %_llgo_15
|
||||
|
||||
_llgo_15: ; preds = %_llgo_14, %_llgo_13
|
||||
%67 = phi { { i64 }, i1 } [ %62, %_llgo_13 ], [ %66, %_llgo_14 ]
|
||||
%68 = extractvalue { { i64 }, i1 } %67, 0
|
||||
store { i64 } %68, ptr %12, align 4
|
||||
%69 = extractvalue { { i64 }, i1 } %67, 1
|
||||
br i1 %69, label %_llgo_4, label %_llgo_6
|
||||
|
||||
_llgo_16: ; preds = %_llgo_5
|
||||
%70 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1
|
||||
%71 = ptrtoint ptr %70 to i64
|
||||
%72 = alloca { i64 }, align 8
|
||||
%73 = getelementptr inbounds { i64 }, ptr %72, i32 0, i32 0
|
||||
store i64 %71, ptr %73, align 4
|
||||
%74 = load { i64 }, ptr %72, align 4
|
||||
%75 = alloca { { i64 }, i1 }, align 8
|
||||
%76 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 0
|
||||
store { i64 } %74, ptr %76, align 4
|
||||
%77 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 1
|
||||
store i1 true, ptr %77, align 1
|
||||
%78 = load { { i64 }, i1 }, ptr %75, align 4
|
||||
br label %_llgo_18
|
||||
|
||||
_llgo_17: ; preds = %_llgo_5
|
||||
%79 = alloca { { i64 }, i1 }, align 8
|
||||
%80 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 0
|
||||
store { i64 } zeroinitializer, ptr %80, align 4
|
||||
%81 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 1
|
||||
store i1 false, ptr %81, align 1
|
||||
%82 = load { { i64 }, i1 }, ptr %79, align 4
|
||||
br label %_llgo_18
|
||||
|
||||
_llgo_18: ; preds = %_llgo_17, %_llgo_16
|
||||
%83 = phi { { i64 }, i1 } [ %78, %_llgo_16 ], [ %82, %_llgo_17 ]
|
||||
%84 = extractvalue { { i64 }, i1 } %83, 0
|
||||
store { i64 } %84, ptr %23, align 4
|
||||
%85 = extractvalue { { i64 }, i1 } %83, 1
|
||||
br i1 %85, label %_llgo_7, label %_llgo_9
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64)
|
||||
|
||||
define void @"main.init$abi"() {
|
||||
_llgo_0:
|
||||
%0 = load ptr, ptr @_llgo_int, align 8
|
||||
%1 = icmp eq ptr %0, null
|
||||
br i1 %1, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2)
|
||||
store ptr %2, ptr @_llgo_int, align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
%3 = load ptr, ptr @_llgo_int, align 8
|
||||
%4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0
|
||||
store ptr @0, ptr %5, align 8
|
||||
%6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1
|
||||
store i64 1, ptr %6, align 4
|
||||
%7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8
|
||||
%8 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %8, i32 0, i32 0
|
||||
store ptr @1, ptr %9, align 8
|
||||
%10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %8, i32 0, i32 1
|
||||
store i64 0, ptr %10, align 4
|
||||
%11 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %8, align 8
|
||||
%12 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %7, ptr %3, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %11, i1 false)
|
||||
%13 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %13, i32 0, i32 0
|
||||
store ptr @2, ptr %14, align 8
|
||||
%15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %13, i32 0, i32 1
|
||||
store i64 4, ptr %15, align 4
|
||||
%16 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %13, align 8
|
||||
%17 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56)
|
||||
%18 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %17, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %12, ptr %18, align 8
|
||||
%19 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, i32 0, i32 0
|
||||
store ptr %17, ptr %20, align 8
|
||||
%21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, i32 0, i32 1
|
||||
store i64 1, ptr %21, align 4
|
||||
%22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, i32 0, i32 2
|
||||
store i64 1, ptr %22, align 4
|
||||
%23 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, align 8
|
||||
%24 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %16, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %23)
|
||||
store ptr %24, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8
|
||||
%25 = load ptr, ptr @_llgo_int, align 8
|
||||
%26 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8
|
||||
%27 = icmp eq ptr %26, null
|
||||
br i1 %27, label %_llgo_3, label %_llgo_4
|
||||
|
||||
_llgo_3: ; preds = %_llgo_2
|
||||
%28 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 0
|
||||
store ptr @3, ptr %29, align 8
|
||||
%30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 1
|
||||
store i64 1, ptr %30, align 4
|
||||
%31 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %28, align 8
|
||||
%32 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%33 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %32, i32 0, i32 0
|
||||
store ptr @4, ptr %33, align 8
|
||||
%34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %32, i32 0, i32 1
|
||||
store i64 0, ptr %34, align 4
|
||||
%35 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %32, align 8
|
||||
%36 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %31, ptr %25, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %35, i1 false)
|
||||
%37 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 0
|
||||
store ptr @5, ptr %38, align 8
|
||||
%39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 1
|
||||
store i64 4, ptr %39, align 4
|
||||
%40 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %37, align 8
|
||||
%41 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56)
|
||||
%42 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %41, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %36, ptr %42, align 8
|
||||
%43 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, i32 0, i32 0
|
||||
store ptr %41, ptr %44, align 8
|
||||
%45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, i32 0, i32 1
|
||||
store i64 1, ptr %45, align 4
|
||||
%46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, i32 0, i32 2
|
||||
store i64 1, ptr %46, align 4
|
||||
%47 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, align 8
|
||||
%48 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %40, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %47)
|
||||
store ptr %48, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8
|
||||
br label %_llgo_4
|
||||
|
||||
_llgo_4: ; preds = %_llgo_3, %_llgo_2
|
||||
ret void
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/cl/internal/foo.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.Bar"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.F"()
|
||||
26
cl/_testgo/struczero/in.go
Normal file
26
cl/_testgo/struczero/in.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package main
|
||||
|
||||
import "github.com/goplus/llgo/cl/internal/foo"
|
||||
|
||||
type bar struct {
|
||||
pb *byte
|
||||
f float32
|
||||
}
|
||||
|
||||
func Foo(v any) (ret bar, ok bool) {
|
||||
ret, ok = v.(bar)
|
||||
return
|
||||
}
|
||||
|
||||
func Bar(v any) (ret foo.Foo, ok bool) {
|
||||
ret, ok = v.(foo.Foo)
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
ret, ok := Foo(nil)
|
||||
println(ret.pb, ret.f, "notOk:", !ok)
|
||||
|
||||
ret2, ok2 := Bar(foo.Foo{})
|
||||
println(ret2.Pb(), ret2.F, ok2)
|
||||
}
|
||||
482
cl/_testgo/struczero/out.ll
Normal file
482
cl/_testgo/struczero/out.ll
Normal file
@@ -0,0 +1,482 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/cl/internal/foo.Foo" = type { ptr, float }
|
||||
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
|
||||
%main.bar = type { ptr, float }
|
||||
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
|
||||
%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 }
|
||||
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
|
||||
%"github.com/goplus/llgo/internal/abi.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr }
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo" = linkonce global ptr null
|
||||
@"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs" = global ptr null
|
||||
@"*_llgo_byte" = linkonce global ptr null
|
||||
@_llgo_byte = linkonce global ptr null
|
||||
@_llgo_float32 = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [3 x i8] c"pb\00", align 1
|
||||
@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@2 = private unnamed_addr constant [2 x i8] c"F\00", align 1
|
||||
@3 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@5 = private unnamed_addr constant [3 x i8] c"Pb\00", align 1
|
||||
@"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE" = linkonce global ptr null
|
||||
@6 = private unnamed_addr constant [39 x i8] c"github.com/goplus/llgo/cl/internal/foo\00", align 1
|
||||
@7 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/internal/foo.Foo\00", align 1
|
||||
@_llgo_main.bar = global ptr null
|
||||
@"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo" = global ptr null
|
||||
@8 = private unnamed_addr constant [3 x i8] c"pb\00", align 1
|
||||
@9 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@10 = private unnamed_addr constant [2 x i8] c"f\00", align 1
|
||||
@11 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
||||
@12 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@13 = private unnamed_addr constant [5 x i8] c"main\00", align 1
|
||||
@14 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@15 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1
|
||||
|
||||
define { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %0) {
|
||||
_llgo_0:
|
||||
%1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0
|
||||
%2 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8
|
||||
%3 = icmp eq ptr %1, %2
|
||||
br i1 %3, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1
|
||||
%5 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %4, align 8
|
||||
%6 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8
|
||||
%7 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 0
|
||||
store %"github.com/goplus/llgo/cl/internal/foo.Foo" %5, ptr %7, align 8
|
||||
%8 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 1
|
||||
store i1 true, ptr %8, align 1
|
||||
%9 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, align 8
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_2: ; preds = %_llgo_0
|
||||
%10 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8
|
||||
%11 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 0
|
||||
store { ptr, double } zeroinitializer, ptr %11, align 8
|
||||
%12 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 1
|
||||
store i1 false, ptr %12, align 1
|
||||
%13 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, align 8
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_3: ; preds = %_llgo_2, %_llgo_1
|
||||
%14 = phi { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ]
|
||||
%15 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 0
|
||||
%16 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 1
|
||||
%mrv = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } poison, %"github.com/goplus/llgo/cl/internal/foo.Foo" %15, 0
|
||||
%mrv1 = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv, i1 %16, 1
|
||||
ret { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv1
|
||||
}
|
||||
|
||||
define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) {
|
||||
_llgo_0:
|
||||
%1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0
|
||||
%2 = load ptr, ptr @_llgo_main.bar, align 8
|
||||
%3 = icmp eq ptr %1, %2
|
||||
br i1 %3, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1
|
||||
%5 = load %main.bar, ptr %4, align 8
|
||||
%6 = alloca { %main.bar, i1 }, align 8
|
||||
%7 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 0
|
||||
store %main.bar %5, ptr %7, align 8
|
||||
%8 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 1
|
||||
store i1 true, ptr %8, align 1
|
||||
%9 = load { %main.bar, i1 }, ptr %6, align 8
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_2: ; preds = %_llgo_0
|
||||
%10 = alloca { %main.bar, i1 }, align 8
|
||||
%11 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 0
|
||||
store { ptr, double } zeroinitializer, ptr %11, align 8
|
||||
%12 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 1
|
||||
store i1 false, ptr %12, align 1
|
||||
%13 = load { %main.bar, i1 }, ptr %10, align 8
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_3: ; preds = %_llgo_2, %_llgo_1
|
||||
%14 = phi { %main.bar, i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ]
|
||||
%15 = extractvalue { %main.bar, i1 } %14, 0
|
||||
%16 = extractvalue { %main.bar, i1 } %14, 1
|
||||
%mrv = insertvalue { %main.bar, i1 } poison, %main.bar %15, 0
|
||||
%mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %16, 1
|
||||
ret { %main.bar, i1 } %mrv1
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/cl/internal/foo.init"()
|
||||
call void @"main.init$abi"()
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = alloca %main.bar, align 8
|
||||
%3 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %2, i64 16)
|
||||
%4 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer)
|
||||
%5 = extractvalue { %main.bar, i1 } %4, 0
|
||||
store %main.bar %5, ptr %3, align 8
|
||||
%6 = extractvalue { %main.bar, i1 } %4, 1
|
||||
%7 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 0
|
||||
%8 = load ptr, ptr %7, align 8
|
||||
%9 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 1
|
||||
%10 = load float, ptr %9, align 4
|
||||
%11 = xor i1 %6, true
|
||||
%12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0
|
||||
store ptr @15, ptr %13, align 8
|
||||
%14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1
|
||||
store i64 6, ptr %14, align 4
|
||||
%15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %8)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
%16 = fpext float %10 to double
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %16)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
%17 = alloca %"github.com/goplus/llgo/cl/internal/foo.Foo", align 8
|
||||
%18 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %17, i64 16)
|
||||
%19 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8
|
||||
%20 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
|
||||
store %"github.com/goplus/llgo/cl/internal/foo.Foo" zeroinitializer, ptr %20, align 8
|
||||
%21 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
|
||||
%22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 0
|
||||
store ptr %19, ptr %22, align 8
|
||||
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 1
|
||||
store ptr %20, ptr %23, align 8
|
||||
%24 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, align 8
|
||||
%25 = call { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %24)
|
||||
%26 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 0
|
||||
store %"github.com/goplus/llgo/cl/internal/foo.Foo" %26, ptr %18, align 8
|
||||
%27 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 1
|
||||
%28 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, align 8
|
||||
%29 = call ptr @"github.com/goplus/llgo/cl/internal/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo" %28)
|
||||
%30 = getelementptr inbounds %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, i32 0, i32 1
|
||||
%31 = load float, ptr %30, align 4
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %29)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
%32 = fpext float %31 to double
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %32)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %27)
|
||||
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define void @"main.init$abi"() {
|
||||
_llgo_0:
|
||||
%0 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8
|
||||
%1 = icmp eq ptr %0, null
|
||||
br i1 %1, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 1, i64 1)
|
||||
store ptr %2, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
%3 = load ptr, ptr @_llgo_byte, align 8
|
||||
%4 = icmp eq ptr %3, null
|
||||
br i1 %4, label %_llgo_3, label %_llgo_4
|
||||
|
||||
_llgo_3: ; preds = %_llgo_2
|
||||
%5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8)
|
||||
store ptr %5, ptr @_llgo_byte, align 8
|
||||
br label %_llgo_4
|
||||
|
||||
_llgo_4: ; preds = %_llgo_3, %_llgo_2
|
||||
%6 = load ptr, ptr @_llgo_byte, align 8
|
||||
%7 = load ptr, ptr @"*_llgo_byte", align 8
|
||||
%8 = icmp eq ptr %7, null
|
||||
br i1 %8, label %_llgo_5, label %_llgo_6
|
||||
|
||||
_llgo_5: ; preds = %_llgo_4
|
||||
%9 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %6)
|
||||
store ptr %9, ptr @"*_llgo_byte", align 8
|
||||
br label %_llgo_6
|
||||
|
||||
_llgo_6: ; preds = %_llgo_5, %_llgo_4
|
||||
%10 = load ptr, ptr @"*_llgo_byte", align 8
|
||||
%11 = load ptr, ptr @_llgo_float32, align 8
|
||||
%12 = icmp eq ptr %11, null
|
||||
br i1 %12, label %_llgo_7, label %_llgo_8
|
||||
|
||||
_llgo_7: ; preds = %_llgo_6
|
||||
%13 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13)
|
||||
store ptr %13, ptr @_llgo_float32, align 8
|
||||
br label %_llgo_8
|
||||
|
||||
_llgo_8: ; preds = %_llgo_7, %_llgo_6
|
||||
%14 = load ptr, ptr @_llgo_float32, align 8
|
||||
%15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0
|
||||
store ptr @0, ptr %16, align 8
|
||||
%17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1
|
||||
store i64 2, ptr %17, align 4
|
||||
%18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8
|
||||
%19 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 0
|
||||
store ptr @1, ptr %20, align 8
|
||||
%21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 1
|
||||
store i64 0, ptr %21, align 4
|
||||
%22 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8
|
||||
%23 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %18, ptr %10, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %22, i1 false)
|
||||
%24 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 0
|
||||
store ptr @2, ptr %25, align 8
|
||||
%26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 1
|
||||
store i64 1, ptr %26, align 4
|
||||
%27 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %24, align 8
|
||||
%28 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 0
|
||||
store ptr @3, ptr %29, align 8
|
||||
%30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 1
|
||||
store i64 0, ptr %30, align 4
|
||||
%31 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %28, align 8
|
||||
%32 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %27, ptr %14, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %31, i1 false)
|
||||
%33 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 0
|
||||
store ptr @4, ptr %34, align 8
|
||||
%35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 1
|
||||
store i64 4, ptr %35, align 4
|
||||
%36 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %33, align 8
|
||||
%37 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112)
|
||||
%38 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %37, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %23, ptr %38, align 8
|
||||
%39 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %37, i64 1
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %32, ptr %39, align 8
|
||||
%40 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 0
|
||||
store ptr %37, ptr %41, align 8
|
||||
%42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 1
|
||||
store i64 2, ptr %42, align 4
|
||||
%43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 2
|
||||
store i64 2, ptr %43, align 4
|
||||
%44 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, align 8
|
||||
%45 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %36, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %44)
|
||||
store ptr %45, ptr @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs", align 8
|
||||
%46 = load ptr, ptr @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs", align 8
|
||||
br i1 %1, label %_llgo_9, label %_llgo_10
|
||||
|
||||
_llgo_9: ; preds = %_llgo_8
|
||||
%47 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%48 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %47, i32 0, i32 0
|
||||
store ptr @5, ptr %48, align 8
|
||||
%49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %47, i32 0, i32 1
|
||||
store i64 2, ptr %49, align 4
|
||||
%50 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %47, align 8
|
||||
%51 = load ptr, ptr @"*_llgo_byte", align 8
|
||||
%52 = load ptr, ptr @"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE", align 8
|
||||
%53 = icmp eq ptr %52, null
|
||||
br i1 %53, label %_llgo_11, label %_llgo_12
|
||||
|
||||
_llgo_10: ; preds = %_llgo_12, %_llgo_8
|
||||
%54 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 0, i64 0)
|
||||
store ptr %54, ptr @_llgo_main.bar, align 8
|
||||
%55 = load ptr, ptr @"*_llgo_byte", align 8
|
||||
%56 = load ptr, ptr @_llgo_float32, align 8
|
||||
%57 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %57, i32 0, i32 0
|
||||
store ptr @8, ptr %58, align 8
|
||||
%59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %57, i32 0, i32 1
|
||||
store i64 2, ptr %59, align 4
|
||||
%60 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %57, align 8
|
||||
%61 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%62 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %61, i32 0, i32 0
|
||||
store ptr @9, ptr %62, align 8
|
||||
%63 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %61, i32 0, i32 1
|
||||
store i64 0, ptr %63, align 4
|
||||
%64 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %61, align 8
|
||||
%65 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %60, ptr %55, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %64, i1 false)
|
||||
%66 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%67 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 0
|
||||
store ptr @10, ptr %67, align 8
|
||||
%68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 1
|
||||
store i64 1, ptr %68, align 4
|
||||
%69 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %66, align 8
|
||||
%70 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%71 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %70, i32 0, i32 0
|
||||
store ptr @11, ptr %71, align 8
|
||||
%72 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %70, i32 0, i32 1
|
||||
store i64 0, ptr %72, align 4
|
||||
%73 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %70, align 8
|
||||
%74 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %69, ptr %56, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %73, i1 false)
|
||||
%75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0
|
||||
store ptr @12, ptr %76, align 8
|
||||
%77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1
|
||||
store i64 4, ptr %77, align 4
|
||||
%78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8
|
||||
%79 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112)
|
||||
%80 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %79, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %65, ptr %80, align 8
|
||||
%81 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %79, i64 1
|
||||
store %"github.com/goplus/llgo/internal/abi.StructField" %74, ptr %81, align 8
|
||||
%82 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%83 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, i32 0, i32 0
|
||||
store ptr %79, ptr %83, align 8
|
||||
%84 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, i32 0, i32 1
|
||||
store i64 2, ptr %84, align 4
|
||||
%85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, i32 0, i32 2
|
||||
store i64 2, ptr %85, align 4
|
||||
%86 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, align 8
|
||||
%87 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %78, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %86)
|
||||
store ptr %87, ptr @"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo", align 8
|
||||
%88 = load ptr, ptr @"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo", align 8
|
||||
%89 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %89, i32 0, i32 0
|
||||
store ptr @13, ptr %90, align 8
|
||||
%91 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %89, i32 0, i32 1
|
||||
store i64 4, ptr %91, align 4
|
||||
%92 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %89, align 8
|
||||
%93 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%94 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 0
|
||||
store ptr @14, ptr %94, align 8
|
||||
%95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 1
|
||||
store i64 8, ptr %95, align 4
|
||||
%96 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %93, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %54, %"github.com/goplus/llgo/internal/runtime.String" %92, %"github.com/goplus/llgo/internal/runtime.String" %96, ptr %88, { ptr, i64, i64 } zeroinitializer, { ptr, i64, i64 } zeroinitializer)
|
||||
ret void
|
||||
|
||||
_llgo_11: ; preds = %_llgo_9
|
||||
%97 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
|
||||
%98 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, i32 0, i32 0
|
||||
store ptr %97, ptr %99, align 8
|
||||
%100 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, i32 0, i32 1
|
||||
store i64 0, ptr %100, align 4
|
||||
%101 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, i32 0, i32 2
|
||||
store i64 0, ptr %101, align 4
|
||||
%102 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, align 8
|
||||
%103 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8)
|
||||
%104 = getelementptr ptr, ptr %103, i64 0
|
||||
store ptr %51, ptr %104, align 8
|
||||
%105 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%106 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, i32 0, i32 0
|
||||
store ptr %103, ptr %106, align 8
|
||||
%107 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, i32 0, i32 1
|
||||
store i64 1, ptr %107, align 4
|
||||
%108 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, i32 0, i32 2
|
||||
store i64 1, ptr %108, align 4
|
||||
%109 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, align 8
|
||||
%110 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %102, %"github.com/goplus/llgo/internal/runtime.Slice" %109, i1 false)
|
||||
store ptr %110, ptr @"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE", align 8
|
||||
br label %_llgo_12
|
||||
|
||||
_llgo_12: ; preds = %_llgo_11, %_llgo_9
|
||||
%111 = load ptr, ptr @"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE", align 8
|
||||
%112 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8
|
||||
%113 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 0
|
||||
store %"github.com/goplus/llgo/internal/runtime.String" %50, ptr %113, align 8
|
||||
%114 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 1
|
||||
store ptr %111, ptr %114, align 8
|
||||
%115 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 2
|
||||
store ptr @"github.com/goplus/llgo/cl/internal/foo.(*Foo).Pb", ptr %115, align 8
|
||||
%116 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 3
|
||||
store ptr @"github.com/goplus/llgo/cl/internal/foo.(*Foo).Pb", ptr %116, align 8
|
||||
%117 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %112, align 8
|
||||
%118 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8
|
||||
%119 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 0
|
||||
store %"github.com/goplus/llgo/internal/runtime.String" %50, ptr %119, align 8
|
||||
%120 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 1
|
||||
store ptr %111, ptr %120, align 8
|
||||
%121 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 2
|
||||
store ptr @"github.com/goplus/llgo/cl/internal/foo.(*Foo).Pb", ptr %121, align 8
|
||||
%122 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 3
|
||||
store ptr @"github.com/goplus/llgo/cl/internal/foo.Foo.Pb", ptr %122, align 8
|
||||
%123 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %118, align 8
|
||||
%124 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40)
|
||||
%125 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %124, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.Method" %123, ptr %125, align 8
|
||||
%126 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%127 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, i32 0, i32 0
|
||||
store ptr %124, ptr %127, align 8
|
||||
%128 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, i32 0, i32 1
|
||||
store i64 1, ptr %128, align 4
|
||||
%129 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, i32 0, i32 2
|
||||
store i64 1, ptr %129, align 4
|
||||
%130 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, align 8
|
||||
%131 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40)
|
||||
%132 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %131, i64 0
|
||||
store %"github.com/goplus/llgo/internal/abi.Method" %117, ptr %132, align 8
|
||||
%133 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
|
||||
%134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 0
|
||||
store ptr %131, ptr %134, align 8
|
||||
%135 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 1
|
||||
store i64 1, ptr %135, align 4
|
||||
%136 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 2
|
||||
store i64 1, ptr %136, align 4
|
||||
%137 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, align 8
|
||||
%138 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%139 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %138, i32 0, i32 0
|
||||
store ptr @6, ptr %139, align 8
|
||||
%140 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %138, i32 0, i32 1
|
||||
store i64 38, ptr %140, align 4
|
||||
%141 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %138, align 8
|
||||
%142 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
|
||||
%143 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %142, i32 0, i32 0
|
||||
store ptr @7, ptr %143, align 8
|
||||
%144 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %142, i32 0, i32 1
|
||||
store i64 42, ptr %144, align 4
|
||||
%145 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %142, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %2, %"github.com/goplus/llgo/internal/runtime.String" %141, %"github.com/goplus/llgo/internal/runtime.String" %145, ptr %46, %"github.com/goplus/llgo/internal/runtime.Slice" %130, %"github.com/goplus/llgo/internal/runtime.Slice" %137)
|
||||
br label %_llgo_10
|
||||
}
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64, i64, i64)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice")
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/cl/internal/foo.(*Foo).Pb"(ptr)
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/cl/internal/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo")
|
||||
|
||||
declare void @"github.com/goplus/llgo/cl/internal/foo.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1)
|
||||
11
cl/_testlibc/argv/in.go
Normal file
11
cl/_testlibc/argv/in.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
func main() {
|
||||
for i := c.Int(0); i < c.Argc; i++ {
|
||||
c.Printf(c.Str("%s\n"), c.Index(c.Argv, i))
|
||||
}
|
||||
}
|
||||
50
cl/_testlibc/argv/out.ll
Normal file
50
cl/_testlibc/argv/out.ll
Normal file
@@ -0,0 +1,50 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@0 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_1: ; preds = %_llgo_3
|
||||
%2 = load ptr, ptr @__llgo_argv, align 8
|
||||
%3 = getelementptr ptr, ptr %2, i32 %7
|
||||
%4 = load ptr, ptr %3, align 8
|
||||
%5 = call i32 (ptr, ...) @printf(ptr @0, ptr %4)
|
||||
%6 = add i32 %7, 1
|
||||
br label %_llgo_3
|
||||
|
||||
_llgo_2: ; preds = %_llgo_3
|
||||
ret i32 0
|
||||
|
||||
_llgo_3: ; preds = %_llgo_1, %_llgo_0
|
||||
%7 = phi i32 [ 0, %_llgo_0 ], [ %6, %_llgo_1 ]
|
||||
%8 = load i32, ptr @__llgo_argc, align 4
|
||||
%9 = icmp slt i32 %7, %8
|
||||
br i1 %9, label %_llgo_1, label %_llgo_2
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
20
cl/_testlibc/sqlite/in.go
Normal file
20
cl/_testlibc/sqlite/in.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/sqlite"
|
||||
)
|
||||
|
||||
func main() {
|
||||
db, err := sqlite.OpenV2(c.Str(":memory:"), sqlite.OpenReadWrite|sqlite.OpenMemory, nil)
|
||||
check(err)
|
||||
|
||||
db.Close()
|
||||
}
|
||||
|
||||
func check(err sqlite.Errno) {
|
||||
if err != sqlite.OK {
|
||||
c.Printf(c.Str("==> Error: (%d) %s\n"), err, err.Errstr())
|
||||
c.Exit(1)
|
||||
}
|
||||
}
|
||||
62
cl/_testlibc/sqlite/out.ll
Normal file
62
cl/_testlibc/sqlite/out.ll
Normal file
@@ -0,0 +1,62 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@0 = private unnamed_addr constant [20 x i8] c"==> Error: (%d) %s\0A\00", align 1
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@1 = private unnamed_addr constant [9 x i8] c":memory:\00", align 1
|
||||
|
||||
define void @main.check(i32 %0) {
|
||||
_llgo_0:
|
||||
%1 = icmp ne i32 %0, 0
|
||||
br i1 %1, label %_llgo_1, label %_llgo_2
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
%2 = call ptr @sqlite3_errstr(i32 %0)
|
||||
%3 = call i32 (ptr, ...) @printf(ptr @0, i32 %0, ptr %2)
|
||||
call void @exit(i32 1)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call { ptr, i32 } @"github.com/goplus/llgo/c/sqlite.OpenV2"(ptr @1, i32 130, ptr null)
|
||||
%3 = extractvalue { ptr, i32 } %2, 0
|
||||
%4 = extractvalue { ptr, i32 } %2, 1
|
||||
call void @main.check(i32 %4)
|
||||
%5 = call i32 @sqlite3_close(ptr %3)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare ptr @sqlite3_errstr(i32)
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
|
||||
declare void @exit(i32)
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare { ptr, i32 } @"github.com/goplus/llgo/c/sqlite.OpenV2"(ptr, i32, ptr)
|
||||
|
||||
declare i32 @sqlite3_close(ptr)
|
||||
15
cl/_testpy/callpy/in.go
Normal file
15
cl/_testpy/callpy/in.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
"github.com/goplus/llgo/py/os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := math.Sqrt(py.Float(2))
|
||||
wd := os.Getcwd()
|
||||
c.Printf(c.Str("sqrt(2) = %f\n"), x.Float64())
|
||||
c.Printf(c.Str("cwd = %s\n"), wd.CStr())
|
||||
}
|
||||
74
cl/_testpy/callpy/out.ll
Normal file
74
cl/_testpy/callpy/out.ll
Normal file
@@ -0,0 +1,74 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@__llgo_py.math.sqrt = linkonce global ptr null
|
||||
@__llgo_py.os.getcwd = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [14 x i8] c"sqrt(2) = %f\0A\00", align 1
|
||||
@1 = private unnamed_addr constant [10 x i8] c"cwd = %s\0A\00", align 1
|
||||
@__llgo_py.math = external global ptr
|
||||
@2 = private unnamed_addr constant [5 x i8] c"sqrt\00", align 1
|
||||
@__llgo_py.os = external global ptr
|
||||
@3 = private unnamed_addr constant [7 x i8] c"getcwd\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/py/math.init"()
|
||||
call void @"github.com/goplus/llgo/py/os.init"()
|
||||
%1 = load ptr, ptr @__llgo_py.math, align 8
|
||||
call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @2, ptr @__llgo_py.math.sqrt, ptr null)
|
||||
%2 = load ptr, ptr @__llgo_py.os, align 8
|
||||
call void (ptr, ...) @llgoLoadPyModSyms(ptr %2, ptr @3, ptr @__llgo_py.os.getcwd, ptr null)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
call void @Py_Initialize()
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
|
||||
%3 = load ptr, ptr @__llgo_py.math.sqrt, align 8
|
||||
%4 = call ptr @PyObject_CallOneArg(ptr %3, ptr %2)
|
||||
%5 = load ptr, ptr @__llgo_py.os.getcwd, align 8
|
||||
%6 = call ptr @PyObject_CallNoArgs(ptr %5)
|
||||
%7 = call double @PyFloat_AsDouble(ptr %4)
|
||||
%8 = call i32 (ptr, ...) @printf(ptr @0, double %7)
|
||||
%9 = call ptr @PyUnicode_AsUTF8(ptr %6)
|
||||
%10 = call i32 (ptr, ...) @printf(ptr @1, ptr %9)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/math.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/os.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @PyFloat_FromDouble(double)
|
||||
|
||||
declare ptr @PyObject_CallOneArg(ptr, ptr)
|
||||
|
||||
declare ptr @PyObject_CallNoArgs(ptr)
|
||||
|
||||
declare double @PyFloat_AsDouble(ptr)
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
|
||||
declare ptr @PyUnicode_AsUTF8(ptr)
|
||||
|
||||
declare void @llgoLoadPyModSyms(ptr, ...)
|
||||
|
||||
declare void @Py_Initialize()
|
||||
12
cl/_testpy/gcd/in.go
Normal file
12
cl/_testpy/gcd/in.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := math.Gcd(py.Long(60), py.Long(20), py.Long(25))
|
||||
c.Printf(c.Str("gcd(60, 20, 25) = %d\n"), x.Long())
|
||||
}
|
||||
59
cl/_testpy/gcd/out.ll
Normal file
59
cl/_testpy/gcd/out.ll
Normal file
@@ -0,0 +1,59 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@__llgo_py.math.gcd = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [22 x i8] c"gcd(60, 20, 25) = %d\0A\00", align 1
|
||||
@__llgo_py.math = external global ptr
|
||||
@1 = private unnamed_addr constant [4 x i8] c"gcd\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/py/math.init"()
|
||||
%1 = load ptr, ptr @__llgo_py.math, align 8
|
||||
call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @1, ptr @__llgo_py.math.gcd, ptr null)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
call void @Py_Initialize()
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call ptr @PyLong_FromLong(i32 60)
|
||||
%3 = call ptr @PyLong_FromLong(i32 20)
|
||||
%4 = call ptr @PyLong_FromLong(i32 25)
|
||||
%5 = load ptr, ptr @__llgo_py.math.gcd, align 8
|
||||
%6 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %5, ptr %2, ptr %3, ptr %4, ptr null)
|
||||
%7 = call i32 @PyLong_AsLong(ptr %6)
|
||||
%8 = call i32 (ptr, ...) @printf(ptr @0, i32 %7)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/math.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @PyLong_FromLong(i32)
|
||||
|
||||
declare ptr @PyObject_CallFunctionObjArgs(ptr, ...)
|
||||
|
||||
declare i32 @PyLong_AsLong(ptr)
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
|
||||
declare void @llgoLoadPyModSyms(ptr, ...)
|
||||
|
||||
declare void @Py_Initialize()
|
||||
14
cl/_testpy/math/in.go
Normal file
14
cl/_testpy/math/in.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package math
|
||||
|
||||
import (
|
||||
_ "unsafe"
|
||||
|
||||
"github.com/goplus/llgo/py"
|
||||
)
|
||||
|
||||
const (
|
||||
LLGoPackage = "py.math"
|
||||
)
|
||||
|
||||
//go:linkname Sqrt py.sqrt
|
||||
func Sqrt(x *py.Object) *py.Object
|
||||
28
cl/_testpy/math/out.ll
Normal file
28
cl/_testpy/math/out.ll
Normal file
@@ -0,0 +1,28 @@
|
||||
; ModuleID = 'math'
|
||||
source_filename = "math"
|
||||
|
||||
@"math.init$guard" = global ptr null
|
||||
@__llgo_py.math = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [5 x i8] c"math\00", align 1
|
||||
|
||||
define void @math.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"math.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"math.init$guard", align 1
|
||||
%1 = load ptr, ptr @__llgo_py.math, align 8
|
||||
%2 = icmp ne ptr %1, null
|
||||
br i1 %2, label %_llgo_2, label %_llgo_3
|
||||
|
||||
_llgo_2: ; preds = %_llgo_3, %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
|
||||
_llgo_3: ; preds = %_llgo_1
|
||||
%3 = call ptr @PyImport_ImportModule(ptr @0)
|
||||
store ptr %3, ptr @__llgo_py.math, align 8
|
||||
br label %_llgo_2
|
||||
}
|
||||
|
||||
declare ptr @PyImport_ImportModule(ptr)
|
||||
24
cl/_testpy/matrix/in.go
Normal file
24
cl/_testpy/matrix/in.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/numpy"
|
||||
)
|
||||
|
||||
func main() {
|
||||
a := py.List(
|
||||
py.List(1.0, 2.0, 3.0),
|
||||
py.List(4.0, 5.0, 6.0),
|
||||
py.List(7.0, 8.0, 9.0),
|
||||
)
|
||||
b := py.List(
|
||||
py.List(9.0, 8.0, 7.0),
|
||||
py.List(6.0, 5.0, 4.0),
|
||||
py.List(3.0, 2.0, 1.0),
|
||||
)
|
||||
x := numpy.Add(a, b)
|
||||
c.Printf(c.Str("a = %s\n"), a.Str().CStr())
|
||||
c.Printf(c.Str("a = %s\n"), b.Str().CStr())
|
||||
c.Printf(c.Str("a+b = %s\n"), x.Str().CStr())
|
||||
}
|
||||
121
cl/_testpy/matrix/out.ll
Normal file
121
cl/_testpy/matrix/out.ll
Normal file
@@ -0,0 +1,121 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@__llgo_py.numpy.add = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [8 x i8] c"a = %s\0A\00", align 1
|
||||
@1 = private unnamed_addr constant [8 x i8] c"a = %s\0A\00", align 1
|
||||
@2 = private unnamed_addr constant [10 x i8] c"a+b = %s\0A\00", align 1
|
||||
@__llgo_py.numpy = external global ptr
|
||||
@3 = private unnamed_addr constant [4 x i8] c"add\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/py/numpy.init"()
|
||||
%1 = load ptr, ptr @__llgo_py.numpy, align 8
|
||||
call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @3, ptr @__llgo_py.numpy.add, ptr null)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
call void @Py_Initialize()
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call ptr @PyList_New(i64 3)
|
||||
%3 = call ptr @PyFloat_FromDouble(double 1.000000e+00)
|
||||
%4 = call i32 @PyList_SetItem(ptr %2, i64 0, ptr %3)
|
||||
%5 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
|
||||
%6 = call i32 @PyList_SetItem(ptr %2, i64 1, ptr %5)
|
||||
%7 = call ptr @PyFloat_FromDouble(double 3.000000e+00)
|
||||
%8 = call i32 @PyList_SetItem(ptr %2, i64 2, ptr %7)
|
||||
%9 = call ptr @PyList_New(i64 3)
|
||||
%10 = call ptr @PyFloat_FromDouble(double 4.000000e+00)
|
||||
%11 = call i32 @PyList_SetItem(ptr %9, i64 0, ptr %10)
|
||||
%12 = call ptr @PyFloat_FromDouble(double 5.000000e+00)
|
||||
%13 = call i32 @PyList_SetItem(ptr %9, i64 1, ptr %12)
|
||||
%14 = call ptr @PyFloat_FromDouble(double 6.000000e+00)
|
||||
%15 = call i32 @PyList_SetItem(ptr %9, i64 2, ptr %14)
|
||||
%16 = call ptr @PyList_New(i64 3)
|
||||
%17 = call ptr @PyFloat_FromDouble(double 7.000000e+00)
|
||||
%18 = call i32 @PyList_SetItem(ptr %16, i64 0, ptr %17)
|
||||
%19 = call ptr @PyFloat_FromDouble(double 8.000000e+00)
|
||||
%20 = call i32 @PyList_SetItem(ptr %16, i64 1, ptr %19)
|
||||
%21 = call ptr @PyFloat_FromDouble(double 9.000000e+00)
|
||||
%22 = call i32 @PyList_SetItem(ptr %16, i64 2, ptr %21)
|
||||
%23 = call ptr @PyList_New(i64 3)
|
||||
%24 = call i32 @PyList_SetItem(ptr %23, i64 0, ptr %2)
|
||||
%25 = call i32 @PyList_SetItem(ptr %23, i64 1, ptr %9)
|
||||
%26 = call i32 @PyList_SetItem(ptr %23, i64 2, ptr %16)
|
||||
%27 = call ptr @PyList_New(i64 3)
|
||||
%28 = call ptr @PyFloat_FromDouble(double 9.000000e+00)
|
||||
%29 = call i32 @PyList_SetItem(ptr %27, i64 0, ptr %28)
|
||||
%30 = call ptr @PyFloat_FromDouble(double 8.000000e+00)
|
||||
%31 = call i32 @PyList_SetItem(ptr %27, i64 1, ptr %30)
|
||||
%32 = call ptr @PyFloat_FromDouble(double 7.000000e+00)
|
||||
%33 = call i32 @PyList_SetItem(ptr %27, i64 2, ptr %32)
|
||||
%34 = call ptr @PyList_New(i64 3)
|
||||
%35 = call ptr @PyFloat_FromDouble(double 6.000000e+00)
|
||||
%36 = call i32 @PyList_SetItem(ptr %34, i64 0, ptr %35)
|
||||
%37 = call ptr @PyFloat_FromDouble(double 5.000000e+00)
|
||||
%38 = call i32 @PyList_SetItem(ptr %34, i64 1, ptr %37)
|
||||
%39 = call ptr @PyFloat_FromDouble(double 4.000000e+00)
|
||||
%40 = call i32 @PyList_SetItem(ptr %34, i64 2, ptr %39)
|
||||
%41 = call ptr @PyList_New(i64 3)
|
||||
%42 = call ptr @PyFloat_FromDouble(double 3.000000e+00)
|
||||
%43 = call i32 @PyList_SetItem(ptr %41, i64 0, ptr %42)
|
||||
%44 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
|
||||
%45 = call i32 @PyList_SetItem(ptr %41, i64 1, ptr %44)
|
||||
%46 = call ptr @PyFloat_FromDouble(double 1.000000e+00)
|
||||
%47 = call i32 @PyList_SetItem(ptr %41, i64 2, ptr %46)
|
||||
%48 = call ptr @PyList_New(i64 3)
|
||||
%49 = call i32 @PyList_SetItem(ptr %48, i64 0, ptr %27)
|
||||
%50 = call i32 @PyList_SetItem(ptr %48, i64 1, ptr %34)
|
||||
%51 = call i32 @PyList_SetItem(ptr %48, i64 2, ptr %41)
|
||||
%52 = load ptr, ptr @__llgo_py.numpy.add, align 8
|
||||
%53 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %52, ptr %23, ptr %48, ptr null)
|
||||
%54 = call ptr @PyObject_Str(ptr %23)
|
||||
%55 = call ptr @PyUnicode_AsUTF8(ptr %54)
|
||||
%56 = call i32 (ptr, ...) @printf(ptr @0, ptr %55)
|
||||
%57 = call ptr @PyObject_Str(ptr %48)
|
||||
%58 = call ptr @PyUnicode_AsUTF8(ptr %57)
|
||||
%59 = call i32 (ptr, ...) @printf(ptr @1, ptr %58)
|
||||
%60 = call ptr @PyObject_Str(ptr %53)
|
||||
%61 = call ptr @PyUnicode_AsUTF8(ptr %60)
|
||||
%62 = call i32 (ptr, ...) @printf(ptr @2, ptr %61)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/numpy.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @PyList_New(i64)
|
||||
|
||||
declare ptr @PyFloat_FromDouble(double)
|
||||
|
||||
declare i32 @PyList_SetItem(ptr, i64, ptr)
|
||||
|
||||
declare ptr @PyObject_CallFunctionObjArgs(ptr, ...)
|
||||
|
||||
declare ptr @PyObject_Str(ptr)
|
||||
|
||||
declare ptr @PyUnicode_AsUTF8(ptr)
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
|
||||
declare void @llgoLoadPyModSyms(ptr, ...)
|
||||
|
||||
declare void @Py_Initialize()
|
||||
15
cl/_testpy/max/in.go
Normal file
15
cl/_testpy/max/in.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/std"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := std.Max(py.Float(3.0), py.Float(9.0), py.Float(23.0), py.Float(100.0))
|
||||
std.Print(x)
|
||||
|
||||
list := py.List(3.0, 9.0, 23.0, 100.0)
|
||||
y := std.Max(std.Iter(list))
|
||||
std.Print(y)
|
||||
}
|
||||
80
cl/_testpy/max/out.ll
Normal file
80
cl/_testpy/max/out.ll
Normal file
@@ -0,0 +1,80 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@__llgo_py.builtins.max = linkonce global ptr null
|
||||
@__llgo_py.builtins.print = linkonce global ptr null
|
||||
@__llgo_py.builtins.iter = linkonce global ptr null
|
||||
@__llgo_py.builtins = external global ptr
|
||||
@0 = private unnamed_addr constant [5 x i8] c"iter\00", align 1
|
||||
@1 = private unnamed_addr constant [4 x i8] c"max\00", align 1
|
||||
@2 = private unnamed_addr constant [6 x i8] c"print\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/py/std.init"()
|
||||
%1 = load ptr, ptr @__llgo_py.builtins, align 8
|
||||
call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @0, ptr @__llgo_py.builtins.iter, ptr @1, ptr @__llgo_py.builtins.max, ptr @2, ptr @__llgo_py.builtins.print, ptr null)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
call void @Py_Initialize()
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call ptr @PyFloat_FromDouble(double 3.000000e+00)
|
||||
%3 = call ptr @PyFloat_FromDouble(double 9.000000e+00)
|
||||
%4 = call ptr @PyFloat_FromDouble(double 2.300000e+01)
|
||||
%5 = call ptr @PyFloat_FromDouble(double 1.000000e+02)
|
||||
%6 = load ptr, ptr @__llgo_py.builtins.max, align 8
|
||||
%7 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %6, ptr %2, ptr %3, ptr %4, ptr %5, ptr null)
|
||||
%8 = load ptr, ptr @__llgo_py.builtins.print, align 8
|
||||
%9 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %8, ptr %7, ptr null)
|
||||
%10 = call ptr @PyList_New(i64 4)
|
||||
%11 = call ptr @PyFloat_FromDouble(double 3.000000e+00)
|
||||
%12 = call i32 @PyList_SetItem(ptr %10, i64 0, ptr %11)
|
||||
%13 = call ptr @PyFloat_FromDouble(double 9.000000e+00)
|
||||
%14 = call i32 @PyList_SetItem(ptr %10, i64 1, ptr %13)
|
||||
%15 = call ptr @PyFloat_FromDouble(double 2.300000e+01)
|
||||
%16 = call i32 @PyList_SetItem(ptr %10, i64 2, ptr %15)
|
||||
%17 = call ptr @PyFloat_FromDouble(double 1.000000e+02)
|
||||
%18 = call i32 @PyList_SetItem(ptr %10, i64 3, ptr %17)
|
||||
%19 = load ptr, ptr @__llgo_py.builtins.iter, align 8
|
||||
%20 = call ptr @PyObject_CallOneArg(ptr %19, ptr %10)
|
||||
%21 = load ptr, ptr @__llgo_py.builtins.max, align 8
|
||||
%22 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %21, ptr %20, ptr null)
|
||||
%23 = load ptr, ptr @__llgo_py.builtins.print, align 8
|
||||
%24 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %23, ptr %22, ptr null)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/std.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @PyFloat_FromDouble(double)
|
||||
|
||||
declare ptr @PyObject_CallFunctionObjArgs(ptr, ...)
|
||||
|
||||
declare ptr @PyList_New(i64)
|
||||
|
||||
declare i32 @PyList_SetItem(ptr, i64, ptr)
|
||||
|
||||
declare ptr @PyObject_CallOneArg(ptr, ptr)
|
||||
|
||||
declare void @llgoLoadPyModSyms(ptr, ...)
|
||||
|
||||
declare void @Py_Initialize()
|
||||
10
cl/_testpy/pi/in.go
Normal file
10
cl/_testpy/pi/in.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c.Printf(c.Str("pi = %f\n"), math.Pi.Float64())
|
||||
}
|
||||
49
cl/_testpy/pi/out.ll
Normal file
49
cl/_testpy/pi/out.ll
Normal file
@@ -0,0 +1,49 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@0 = private unnamed_addr constant [9 x i8] c"pi = %f\0A\00", align 1
|
||||
@__llgo_py.math = external global ptr
|
||||
@1 = private unnamed_addr constant [3 x i8] c"pi\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/py/math.init"()
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
call void @Py_Initialize()
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = load ptr, ptr @__llgo_py.math, align 8
|
||||
%3 = call ptr @PyObject_GetAttrString(ptr %2, ptr @1)
|
||||
%4 = call double @PyFloat_AsDouble(ptr %3)
|
||||
%5 = call i32 (ptr, ...) @printf(ptr @0, double %4)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/math.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @PyObject_GetAttrString(ptr, ptr)
|
||||
|
||||
declare double @PyFloat_AsDouble(ptr)
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
|
||||
declare void @Py_Initialize()
|
||||
12
cl/_testpy/pow/in.go
Normal file
12
cl/_testpy/pow/in.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/py"
|
||||
"github.com/goplus/llgo/py/math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
x := math.Pow(py.Float(2), py.Float(3))
|
||||
c.Printf(c.Str("pow(2, 3) = %f\n"), x.Float64())
|
||||
}
|
||||
58
cl/_testpy/pow/out.ll
Normal file
58
cl/_testpy/pow/out.ll
Normal file
@@ -0,0 +1,58 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
@__llgo_py.math.pow = linkonce global ptr null
|
||||
@0 = private unnamed_addr constant [16 x i8] c"pow(2, 3) = %f\0A\00", align 1
|
||||
@__llgo_py.math = external global ptr
|
||||
@1 = private unnamed_addr constant [4 x i8] c"pow\00", align 1
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
call void @"github.com/goplus/llgo/py/math.init"()
|
||||
%1 = load ptr, ptr @__llgo_py.math, align 8
|
||||
call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @1, ptr @__llgo_py.math.pow, ptr null)
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
call void @Py_Initialize()
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
%2 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
|
||||
%3 = call ptr @PyFloat_FromDouble(double 3.000000e+00)
|
||||
%4 = load ptr, ptr @__llgo_py.math.pow, align 8
|
||||
%5 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %4, ptr %2, ptr %3, ptr null)
|
||||
%6 = call double @PyFloat_AsDouble(ptr %5)
|
||||
%7 = call i32 (ptr, ...) @printf(ptr @0, double %6)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/py/math.init"()
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
|
||||
declare ptr @PyFloat_FromDouble(double)
|
||||
|
||||
declare ptr @PyObject_CallFunctionObjArgs(ptr, ...)
|
||||
|
||||
declare double @PyFloat_AsDouble(ptr)
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
|
||||
declare void @llgoLoadPyModSyms(ptr, ...)
|
||||
|
||||
declare void @Py_Initialize()
|
||||
17
cl/_testrt/_gotypes/in.go
Normal file
17
cl/_testrt/_gotypes/in.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package main
|
||||
|
||||
type base interface {
|
||||
f(m map[string]func())
|
||||
}
|
||||
|
||||
type bar interface {
|
||||
base
|
||||
g(c chan func())
|
||||
}
|
||||
|
||||
func foo(bar) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
foo(nil)
|
||||
}
|
||||
38
cl/_testrt/_gotypes/out.ll
Normal file
38
cl/_testrt/_gotypes/out.ll
Normal file
@@ -0,0 +1,38 @@
|
||||
; ModuleID = 'main'
|
||||
source_filename = "main"
|
||||
|
||||
%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr }
|
||||
|
||||
@"main.init$guard" = global ptr null
|
||||
@__llgo_argc = global ptr null
|
||||
@__llgo_argv = global ptr null
|
||||
|
||||
define void @main.foo(%"github.com/goplus/llgo/internal/runtime.iface" %0) {
|
||||
_llgo_0:
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @main.init() {
|
||||
_llgo_0:
|
||||
%0 = load i1, ptr @"main.init$guard", align 1
|
||||
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||
|
||||
_llgo_1: ; preds = %_llgo_0
|
||||
store i1 true, ptr @"main.init$guard", align 1
|
||||
br label %_llgo_2
|
||||
|
||||
_llgo_2: ; preds = %_llgo_1, %_llgo_0
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main(i32 %0, ptr %1) {
|
||||
_llgo_0:
|
||||
store i32 %0, ptr @__llgo_argc, align 4
|
||||
store ptr %1, ptr @__llgo_argv, align 8
|
||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
call void @main.init()
|
||||
call void @main.foo(%"github.com/goplus/llgo/internal/runtime.iface" zeroinitializer)
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||
12
cl/_testrt/alloca/in.go
Normal file
12
cl/_testrt/alloca/in.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/internal/runtime/c"
|
||||
)
|
||||
|
||||
func main() {
|
||||
s := c.Str("Hi\n")
|
||||
s2 := c.Alloca(4)
|
||||
c.Memcpy(s2, c.Pointer(s), 4)
|
||||
c.Printf(c.Str("%s"), s2)
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user