Compare commits

...

554 Commits

Author SHA1 Message Date
xushiwei
e5ff33fcc6 Merge pull request #969 from cpunion/find-llgo-root
test: retry failed test to avoid clang error
2025-02-01 21:54:50 +08:00
xushiwei
c60979fff7 Merge pull request #970 from xushiwei/q
README: C/C++, ObjC, Swift
2025-02-01 21:10:38 +08:00
xushiwei
961ad6ebca README: C/C++, ObjC, Swift 2025-02-01 21:00:01 +08:00
Li Jie
f18237a005 test: retry llgo test to avoid clang error 2025-02-01 20:56:55 +08:00
xushiwei
cba93e61b4 Merge pull request #960 from visualfc/instnamed
ssa: abi.NamedName for instance named
2025-02-01 19:23:25 +08:00
xushiwei
e0a6e5d2f9 Merge pull request #968 from cpunion/find-llgo-root
Find llgo root
2025-02-01 19:01:34 +08:00
Li Jie
a9ee323760 test: disable log and output to speed up testing 2025-02-01 14:11:46 +08:00
Li Jie
977db86700 env: warning and fallback if LLGO_ROOT is invalid 2025-02-01 14:11:46 +08:00
Li Jie
93d36d40d8 env: fix version 2025-02-01 14:11:46 +08:00
Li Jie
cabc7ffca8 env: find llgo root for development 2025-02-01 14:11:46 +08:00
Li Jie
521b70c715 test: llgo clean, llgo cmptest, llgo cmptest -gen 2025-02-01 14:11:46 +08:00
Li Jie
b6c5503c5b test: chore/llgen 2025-02-01 14:11:46 +08:00
Li Jie
e7e2ba4790 test: test llgo run -v 2025-02-01 14:11:45 +08:00
Li Jie
8749923f1a test: make cmd testable 2025-02-01 14:11:45 +08:00
Li Jie
25a3e19384 ci: update codecov ignore config 2025-02-01 14:11:40 +08:00
visualfc
b6b686665a compiler/cl: inst named stable sort 2025-02-01 13:52:10 +08:00
visualfc
4f5468469b compiler/cl/_testgo: add tpinst 2025-02-01 12:28:09 +08:00
visualfc
7bc7f23125 ssa: abi.NamedName for instance named 2025-02-01 10:29:35 +08:00
xushiwei
25ed652fc0 Merge pull request #966 from visualfc/reflect_go123
runtime: fix reflect type for go1.23
2025-02-01 03:39:45 +08:00
xushiwei
cc2913352a Merge pull request #955 from visualfc/conv
ssa: fix cvtType check types.Alias
2025-01-30 11:59:35 +08:00
visualfc
ad796ebbec compiler: fix build go1.22 for GODEBUG=gotypesalias=1 2025-01-29 19:07:37 +08:00
visualfc
edd561f8ba runtime: fix reflect type for go1.23 2025-01-29 18:58:36 +08:00
xushiwei
0b1c4fb54f Merge pull request #964 from goplus/dependabot/go_modules/compiler/github.com/goplus/gogen-1.16.6
build(deps): bump github.com/goplus/gogen from 1.16.5 to 1.16.6 in /compiler
2025-01-23 13:44:19 +08:00
dependabot[bot]
9f4eb4f7db build(deps): bump github.com/goplus/gogen in /compiler
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.5 to 1.16.6.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.5...v1.16.6)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-22 01:15:38 +00:00
xushiwei
f6e3a3917e Merge pull request #959 from luoliwoshang/sys/ExecInChild
syscall(linux): forkAndExecInChild
2025-01-21 07:30:48 +08:00
luoliwoshang
1b536bf5f8 syscall(linux):use clone as go instead fork 2025-01-20 08:30:02 +00:00
xushiwei
e3afdb6c02 Merge pull request #962 from cpunion/fix-abi
fix(ssa): fix incorrectly ABI for uninstantiated generic methods
2025-01-18 23:55:27 +08:00
Li Jie
918b36e28f fix(ssa): fix incorrectly generated ABI for uninstantiated generic methods 2025-01-17 20:36:04 +08:00
luoliwoshang
ce26637410 demo:command run 2025-01-17 08:30:07 +00:00
luoliwoshang
2053c72008 c/os:dup3 2025-01-16 11:00:18 +00:00
luoliwoshang
275bde6461 syscall(linux): forkAndExecInChild 2025-01-16 10:59:38 +00:00
luoliwoshang
f85382edd4 c/syscall: zsysnum 2025-01-14 14:09:52 +00:00
xushiwei
e016e92c41 Merge pull request #949 from goplus/dependabot/go_modules/compiler/github.com/goplus/gogen-1.16.5
build(deps): bump github.com/goplus/gogen from 1.16.4 to 1.16.5 in /compiler
2025-01-13 19:48:20 +08:00
dependabot[bot]
2594b8e3f9 build(deps): bump github.com/goplus/gogen in /compiler
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.4 to 1.16.5.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.4...v1.16.5)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 11:08:50 +00:00
xushiwei
1e1ef594c8 Merge pull request #951 from xushiwei/q
xtool/clang: disable types
2025-01-13 19:08:05 +08:00
xushiwei
01c660faba Merge pull request #952 from goplus/dependabot/go_modules/compiler/github.com/goplus/mod-0.13.16
build(deps): bump github.com/goplus/mod from 0.13.15 to 0.13.16 in /compiler
2025-01-13 19:07:35 +08:00
visualfc
9f76237705 ssa: fix cvtType check types.Alias 2025-01-13 12:38:15 +08:00
dependabot[bot]
59d3e3f3da build(deps): bump github.com/goplus/mod in /compiler
Bumps [github.com/goplus/mod](https://github.com/goplus/mod) from 0.13.15 to 0.13.16.
- [Release notes](https://github.com/goplus/mod/releases)
- [Commits](https://github.com/goplus/mod/compare/v0.13.15...v0.13.16)

---
updated-dependencies:
- dependency-name: github.com/goplus/mod
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 01:05:42 +00:00
xushiwei
e5dd237f12 xtool/clang: disable types 2025-01-13 09:05:19 +08:00
xushiwei
e9729bea7e Merge pull request #945 from goplus/dependabot/go_modules/compiler/github.com/goplus/mod-0.13.15
build(deps): bump github.com/goplus/mod from 0.13.13 to 0.13.15 in /compiler
2025-01-12 09:11:46 +08:00
dependabot[bot]
d46b17d8a0 build(deps): bump github.com/goplus/mod in /compiler
Bumps [github.com/goplus/mod](https://github.com/goplus/mod) from 0.13.13 to 0.13.15.
- [Release notes](https://github.com/goplus/mod/releases)
- [Commits](https://github.com/goplus/mod/compare/v0.13.13...v0.13.15)

---
updated-dependencies:
- dependency-name: github.com/goplus/mod
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-11 19:36:26 +00:00
xushiwei
383d25226e Update dependabot.yml 2025-01-12 03:35:27 +08:00
xushiwei
745eff0783 Merge pull request #943 from goplus/dependabot/github_actions/actions/cache-4
build(deps): bump actions/cache from 3 to 4
2025-01-10 09:59:23 +08:00
dependabot[bot]
ac301045b9 build(deps): bump actions/cache from 3 to 4
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-10 00:58:56 +00:00
xushiwei
e1f3ca8172 Merge pull request #929 from cpunion/go123
Separate compiler, runtime and llgo library
2025-01-09 20:13:35 +08:00
Li Jie
4ff4ceeb22 ssa: show detail message of runtime failed 2025-01-09 19:50:01 +08:00
Li Jie
4126992a8f compiler: remove completed todo 2025-01-09 19:39:12 +08:00
Li Jie
fd99f63bd6 ci: hello world testing with different version declarations in go.mod and go versions 2025-01-09 18:55:22 +08:00
Li Jie
46dc7c3a77 test: increase test coverage 2025-01-09 18:55:22 +08:00
Li Jie
a8cb551465 env: add tests for codecov 2025-01-09 18:55:21 +08:00
Li Jie
5a5674809c ssa: Builder.TypeName processes types.Alias 2025-01-09 16:59:51 +08:00
Li Jie
761e8a2ac6 compiler: make compiler working on go 1.23 project 2025-01-09 16:11:39 +08:00
Li Jie
dfa7effa14 ci: config release build 2025-01-09 15:39:03 +08:00
Li Jie
09c022e209 cmd: fix return value with arguments 2025-01-09 15:32:27 +08:00
Li Jie
8666a75161 ci: remove unused python libraries installation step 2025-01-09 11:58:24 +08:00
Li Jie
68018d8d04 runtime: clean demo 2025-01-09 09:05:45 +08:00
Li Jie
3d2c014801 cl: clean test 2025-01-09 00:47:45 +08:00
Li Jie
4f9c341103 ci: update codecov ignore 2025-01-09 00:23:30 +08:00
Li Jie
563f03554f test: llgo commands 2025-01-09 00:09:47 +08:00
Li Jie
219376044a ci: fix llgo workflow name 2025-01-08 23:23:58 +08:00
Li Jie
591dac8b41 compiler: remove unused packages 2025-01-08 23:02:46 +08:00
Li Jie
2bc96ade33 lldb: test lldb cross go compilers 2025-01-08 22:16:03 +08:00
Li Jie
95c4456ccc env: get GOROOT from env variable or go env GOROOT 2025-01-08 22:16:03 +08:00
Li Jie
6e6b8b404f runtime: rename clite conflicts function names 2025-01-08 22:16:02 +08:00
Li Jie
27052c21be ci: test lldb last 2025-01-08 22:16:02 +08:00
Li Jie
ec744f7385 chore: move compiler/chore/_xtool to _xtool 2025-01-08 22:16:02 +08:00
Li Jie
d8c5105c91 ci: set LLGO_ROOT for doc test 2025-01-08 22:16:01 +08:00
Li Jie
acd5fb19f5 ci: rename llgo test job name 2025-01-08 15:55:38 +08:00
Li Jie
52ac486814 doc: fix llgo installation 2025-01-08 15:40:11 +08:00
Li Jie
a64b32bf9c ci: compile go with go1.23, test llgo with go 1.20-1.23 2025-01-08 15:36:41 +08:00
Li Jie
b299800e64 compiler: move _lldb into compiler/ 2025-01-08 15:22:09 +08:00
Li Jie
60c430abad test: regenerate test snapshots with gentests 2025-01-08 15:19:38 +08:00
Li Jie
255cce4f9a test: move cchan/cchansel into runtime/_test 2025-01-08 15:03:58 +08:00
Li Jie
1ed99c2574 cl: isAny compatible alias 2025-01-08 14:59:02 +08:00
Li Jie
64b54d4380 ssa: make alias working in go 1.22 2025-01-08 14:59:02 +08:00
Li Jie
6170973b48 compiler: build separation runtime with clite 2025-01-08 14:59:01 +08:00
Li Jie
1172e5bdce build: separate compiler and libs 2025-01-08 14:59:01 +08:00
Li Jie
b0123567cd ci: ignore code coverage of llgo libs 2025-01-08 14:59:00 +08:00
Li Jie
81598621e8 ci: codecov report excludes llgo library 2025-01-08 14:59:00 +08:00
Li Jie
239ac496b2 test: map/slice clear 2025-01-08 14:59:00 +08:00
Li Jie
76fb91619a demo: workaround for reflect abi initialization on go@1.23 2025-01-08 14:58:59 +08:00
Li Jie
e3a2d43ffa runtime: add missing SliceClear 2025-01-08 14:58:59 +08:00
Li Jie
b3f4716616 runtime: patch internal/filepathlite 2025-01-08 14:58:59 +08:00
Li Jie
c602038597 demo: don't use symlinks for x/tools compatible 2025-01-08 14:58:59 +08:00
Li Jie
03b469212e feat: upgrade to x/tools 0.28 2025-01-08 14:58:59 +08:00
xushiwei
db3f6e077e Merge pull request #941 from cpunion/fix-doc-verify
doc: fix macos installation doc verify
2025-01-08 08:58:31 +08:00
Li Jie
06816c51a5 doc: fix macos installation doc verify 2025-01-07 21:28:14 +08:00
xushiwei
9e9e8e82b2 Merge pull request #936 from cpunion/optional-llgo-root
build: make llgo root usage optional for runtime loading
2025-01-07 19:47:40 +08:00
xushiwei
031d4ebedc Merge pull request #937 from MeteorsLiu/main
README: fix dependences requirement for macOS
2025-01-07 18:40:03 +08:00
xushiwei
3446715af8 Merge pull request #934 from cpunion/fix-build
build.ParseArgs returns new slices to fix wrong patterns with flags appending
2025-01-07 18:07:13 +08:00
Rick Guo
c7e68dab62 README: fix dependences for macOS 2025-01-06 17:38:36 +08:00
Li Jie
7093ced2d8 build: make llgo root usage optional for runtime loading
When github.com/goplus/llgo is imported in go.mod, use the user-specified
version instead of LLGoROOT. This allows users to upgrade llgo via go.mod
while maintaining backward compatibility for cases without explicit imports.

Note: This is a temporary solution. The runtime's dependency on
github.com/goplus/llgo/c/* needs to be addressed in future improvements.
2025-01-06 16:36:16 +08:00
Li Jie
179f4dfe22 build: ParseArgs return new slices 2025-01-06 10:10:11 +08:00
xushiwei
03517ce22e Merge pull request #933 from cpunion/independent
env: allow compiling code outside llgo directory
2025-01-05 07:10:29 +08:00
Li Jie
290f99b4d1 env: allow compiling code outside llgo directory 2025-01-04 23:40:13 +08:00
xushiwei
7f10bc2a1b Merge pull request #930 from cpunion/panic-stacktrace
runtime: show stacktrace when panic
2025-01-03 12:04:12 +08:00
Li Jie
9cb48003b0 ci: add libunwind-dev on ubuntu 2025-01-02 23:27:45 +08:00
Li Jie
6df961292d doc: install libunwind-dev on ubuntu 2025-01-02 23:27:45 +08:00
Li Jie
65f855b251 runtime: show stacktrace when panic 2025-01-02 23:27:41 +08:00
xushiwei
5131881bf2 Merge pull request #928 from goplus/dependabot/go_modules/github.com/goplus/llvm-0.8.1
build(deps): bump github.com/goplus/llvm from 0.8.0 to 0.8.1
2024-12-31 19:19:16 +08:00
dependabot[bot]
8fbad90e9d build(deps): bump github.com/goplus/llvm from 0.8.0 to 0.8.1
Bumps [github.com/goplus/llvm](https://github.com/goplus/llvm) from 0.8.0 to 0.8.1.
- [Release notes](https://github.com/goplus/llvm/releases)
- [Commits](https://github.com/goplus/llvm/compare/v0.8.0...v0.8.1)

---
updated-dependencies:
- dependency-name: github.com/goplus/llvm
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-31 11:06:15 +00:00
xushiwei
d0aceebaad Merge pull request #926 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.4
build(deps): bump github.com/goplus/gogen from 1.16.3 to 1.16.4
2024-12-31 13:57:06 +08:00
dependabot[bot]
01b6680000 build(deps): bump github.com/goplus/gogen from 1.16.3 to 1.16.4
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.3 to 1.16.4.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.3...v1.16.4)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-31 05:40:12 +00:00
xushiwei
638883f352 Merge pull request #925 from goplus/dependabot/go_modules/github.com/goplus/mod-0.13.13
build(deps): bump github.com/goplus/mod from 0.13.12 to 0.13.13
2024-12-31 08:10:07 +08:00
dependabot[bot]
467c2fb28d build(deps): bump github.com/goplus/mod from 0.13.12 to 0.13.13
Bumps [github.com/goplus/mod](https://github.com/goplus/mod) from 0.13.12 to 0.13.13.
- [Release notes](https://github.com/goplus/mod/releases)
- [Commits](https://github.com/goplus/mod/compare/v0.13.12...v0.13.13)

---
updated-dependencies:
- dependency-name: github.com/goplus/mod
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 23:56:08 +00:00
xushiwei
0fd129a0d8 Merge pull request #924 from xushiwei/q
llgo get: todo
2024-12-30 21:17:04 +08:00
xushiwei
282125a84b llgo get: todo 2024-12-30 21:16:22 +08:00
xushiwei
97a2824473 Merge pull request #915 from visualfc/runtime.hash
[WIP] internal/runtime: type hash
2024-12-26 08:30:34 +08:00
xushiwei
eff1333269 Merge pull request #922 from visualfc/fixfloat
ssa: fix bitcast for float32
2024-12-24 20:19:32 +08:00
visualfc
3741a28d94 ssa: fix bitcast for float32 2024-12-24 10:02:30 +08:00
xushiwei
6dd4ec160d Merge pull request #921 from visualfc/runtime.closure
ssa: closure use specific struct field name
2024-12-23 10:53:12 +08:00
visualfc
a6a3c09c05 ssa: closure use specific struct field name { $f ftype, $data unsafe.pointer } 2024-12-22 12:44:33 +08:00
visualfc
620cfeabe0 internal/runtime: type hash 2024-12-21 20:07:28 +08:00
xushiwei
070d64f365 Merge pull request #920 from visualfc/runtime.namedset
[WIP] internal/runtime: named(ptr) type preset for method type
2024-12-21 07:13:39 +08:00
visualfc
1d3c98372a internal/runtime: cache rtypeList 2024-12-20 20:45:46 +08:00
visualfc
c1588d70cd internal/runtime: structStr 2024-12-20 16:09:39 +08:00
visualfc
ef28abe896 internal/runtime: funcStr, interfaceStr, array str 2024-12-20 12:33:34 +08:00
visualfc
d251232f8a internal/runtime: named(ptr) type preset for method type 2024-12-20 11:37:30 +08:00
xushiwei
05334de855 Merge pull request #914 from aofei/README
README: add install instructions for Alpine
2024-12-19 18:14:15 +08:00
xushiwei
539b55f826 Merge pull request #917 from visualfc/conststring
ssa: fix const for named string
2024-12-19 18:13:24 +08:00
xushiwei
0699832240 Merge pull request #919 from visualfc/runtime.named
internal/runtime: NewNamedInterface check exist
2024-12-19 18:12:53 +08:00
visualfc
ce169163b9 internal/runtime: NewNamedInterface check exist 2024-12-17 21:36:51 +08:00
xushiwei
b4af70ada9 Merge pull request #916 from visualfc/runtime.interface
abi: fix named interface init
2024-12-17 14:43:15 +08:00
xushiwei
424670d854 Merge pull request #918 from tsingbx/c/_types
include/_types: add Uint8T, Uint16T, Uint32T, Uint64T, IntmaxT, UintmaxT
2024-12-17 14:41:44 +08:00
tsingbx
6ce4644120 include/_types: add Uint8T, Uint16T, Uint32T, Uint64T, IntmaxT, UintmaxT 2024-12-16 18:15:01 +08:00
visualfc
eaf7e56083 ssa: fix const for named string 2024-12-16 15:00:32 +08:00
visualfc
e55a5d7486 internal/runtime: NewNamedInterface, InitNamedInterface 2024-12-16 12:07:13 +08:00
Aofei Sheng
e1d14b1324 README: add install instructions for Alpine
Fixes #910

Signed-off-by: Aofei Sheng <aofei@aofeisheng.com>
2024-12-14 18:06:16 +08:00
xushiwei
04d09eb891 Merge pull request #913 from xushiwei/q
README: cgo, c/ffi
2024-12-14 09:16:18 +08:00
xushiwei
09b4f5dffd README: cgo, c/ffi 2024-12-14 08:15:08 +08:00
xushiwei
29ad96862f Merge pull request #628 from visualfc/go
ssa: fix ssa.go for builtin
2024-12-14 06:44:35 +08:00
xushiwei
839d68d62c Merge pull request #912 from luoliwoshang/c/clang/typesize
c/clang:type size
2024-12-12 22:10:34 +08:00
luoliwoshang
a4d3bf3cb2 c/clang:type size 2024-12-12 18:16:40 +08:00
xushiwei
a05bda9fc3 Merge pull request #762 from spongehah/golib/time
lib/time: patch div and Time.Round
2024-12-10 18:51:45 +08:00
xushiwei
5936b57bac Merge pull request #909 from tsingbx/llgo/linkerror
fix link fail for cjsondemo
2024-12-08 11:24:55 +08:00
tsingbx
af2bcd389e fix link error 2024-12-08 10:18:47 +08:00
xushiwei
4bec9b038b Merge pull request #906 from visualfc/llccheck
[WIP] build: env LLGO_CHECK=1 for llc check module
2024-12-05 12:17:15 +08:00
visualfc
0b3ce5f65a build: env LLGO_CHECK=1 for llc check module 2024-12-05 11:07:21 +08:00
xushiwei
cb8e820f5d Merge pull request #905 from luoliwoshang/c/FILE
c:file
2024-12-05 09:56:43 +08:00
luoliwoshang
0a4ce9d65e c:FILE 2024-12-04 15:02:54 +08:00
xushiwei
f20d74c1f3 Merge pull request #904 from visualfc/revert-630-deferargs
Revert "ssa: defer load/store func and args"
2024-12-04 09:47:36 +08:00
七叶
3505be422e Revert "ssa: defer load/store func and args" 2024-12-03 21:00:49 +08:00
xushiwei
7e9542e79a Merge pull request #898 from visualfc/expand
xtool/env: fix ExpandEnvToArgs check pkg-config
2024-12-03 09:33:59 +08:00
visualfc
a1c1a4889b xtool/env: fix ExpandEnvToArgs check pkg-config 2024-12-03 09:17:54 +08:00
visualfc
7eeb8084bf ssa: fix ssa.go for builtin 2024-12-02 15:40:56 +08:00
xushiwei
7a5bd6ae6a Merge pull request #630 from visualfc/deferargs
ssa: defer load/store func and args
2024-12-02 13:51:25 +08:00
xushiwei
d20e60afb3 Merge pull request #891 from visualfc/debug
[WIP] c/debug: func addr and info
2024-12-02 13:46:56 +08:00
xushiwei
7340263e6a Merge pull request #893 from tsingbx/clang
add clang.GoString, clang.File functions for helper of llcppsymg struct_methodname
2024-12-02 13:45:55 +08:00
visualfc
6e8cecd13e cl/_testgo: defer6 2024-12-02 11:43:20 +08:00
tsingbx
f106a0854f use temp to reduse clangStr.CStr call times 2024-12-02 10:20:41 +08:00
tsingbx
68b09e87b3 add clang.GoString, clang.File functions for helper of llcppsymg struct_methodname 2024-12-02 09:52:35 +08:00
visualfc
11f2ecd675 ssa: defer load/store func and args 2024-11-30 14:31:23 +08:00
visualfc
7b6b8b0eeb c/debug: StackTrace 2024-11-30 13:47:37 +08:00
visualfc
67f9580c5d c/debug: func addr and info 2024-11-30 13:45:19 +08:00
xushiwei
6a3fce97cf Merge pull request #894 from cpunion/fix-release-build
ci: lock release build to llvm@18
2024-11-29 16:43:35 +08:00
Li Jie
2bd266a7fc ci: lock release build to llvm@18 2024-11-29 10:26:14 +08:00
xushiwei
f6946b88d2 Merge pull request #890 from luoliwoshang/c/sizet
c:some stdint type
2024-11-28 18:25:08 +08:00
xushiwei
5e5df6becd Merge pull request #881 from cpunion/cgo-extra
cgo: support macros and callbacks (fpvars)
2024-11-28 18:24:11 +08:00
luoliwoshang
6c4cb92249 c:stdint type 2024-11-27 23:48:02 +08:00
Li Jie
c3407eac5e cgo: supports //export functions only calls in C 2024-11-27 20:24:53 +08:00
Li Jie
e46b3e24d6 test: move cgo demo into _testgo, and make links 2024-11-27 18:41:56 +08:00
Li Jie
90763de93c cgo: supports c/go callback funcs 2024-11-27 18:41:56 +08:00
Li Jie
5380ffa471 cgo: ignore funcs won't be compiled 2024-11-27 18:41:56 +08:00
Li Jie
c9f436cc47 cgo: full test
cgo: test returning void
2024-11-27 18:41:56 +08:00
Li Jie
39dc68fa4e demo/cgofull: add multi cgo module and macro calling 2024-11-27 18:41:56 +08:00
Li Jie
d6c527f662 cgo: support macros 2024-11-27 18:41:56 +08:00
xushiwei
38a7f4f7d5 Merge pull request #888 from xushiwei/q
mv llcppg => github.com/goplus/llcppg
2024-11-27 17:35:50 +08:00
xushiwei
1605959a04 ci: rm Install llcppg 2024-11-27 17:24:12 +08:00
xushiwei
b837e0005a gogensig 2024-11-27 17:19:21 +08:00
xushiwei
58937a5366 mv llcppsigfetch,llcppsymg => github.com/goplus/llcppg 2024-11-27 17:17:40 +08:00
xushiwei
8562c03f80 mv llcppg => github.com/goplus/llcppg 2024-11-27 17:08:27 +08:00
xushiwei
1cd61b9169 Merge pull request #886 from visualfc/reflect.map
reflect: implement map
2024-11-27 14:12:56 +08:00
xushiwei
c69e289afe Merge pull request #887 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.3
build(deps): bump github.com/goplus/gogen from 1.16.2 to 1.16.3
2024-11-27 14:12:31 +08:00
visualfc
91b46b05ad cl/_testgo/reflect: map demo 2024-11-27 11:31:28 +08:00
visualfc
2412760f1c internal/lib/reflect: makemap 2024-11-27 11:31:07 +08:00
dependabot[bot]
d83c5493c7 build(deps): bump github.com/goplus/gogen from 1.16.2 to 1.16.3
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.2 to 1.16.3.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.2...v1.16.3)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-27 03:26:05 +00:00
xushiwei
d041703dc6 Merge pull request #885 from cpunion/fix
fix: wrong llvm libs flag
2024-11-27 11:24:39 +08:00
visualfc
ecba13c38e internal/lib/reflect: use sync.Map 2024-11-27 10:33:22 +08:00
visualfc
cd3a4bb8c8 reflect: implement map 2024-11-26 20:45:01 +08:00
Li Jie
97f72b93e1 fix: wrong llvm libs flag 2024-11-26 16:08:29 +08:00
xushiwei
e93d57983e Merge pull request #884 from cpunion/unify-build
Unify cltest, llgen, gentests to build.Do
2024-11-26 15:58:06 +08:00
Li Jie
43c4a3bfdc test: enable debug testing 2024-11-26 15:43:34 +08:00
Li Jie
954cc0e8bc test: ignore syncmap since different pthread_mutex_t size on macOS and linux 2024-11-26 13:21:33 +08:00
Li Jie
ad48325dff test: regenerate test fixtures 2024-11-26 13:21:01 +08:00
Li Jie
fa1ad20d5d ffi: fix ci and install doc 2024-11-26 13:19:02 +08:00
Li Jie
0547dede21 cpp: fix ldflags of llvm 2024-11-26 13:19:02 +08:00
Li Jie
284ae23db2 doc: install missing libsqlite3-dev 2024-11-26 13:19:02 +08:00
Li Jie
9105f28c13 ci: don't install pkg-config explicitly 2024-11-26 13:18:59 +08:00
Li Jie
06cc43b11f test: test dirs under _demo only has *.go files 2024-11-26 13:17:36 +08:00
Li Jie
d879d0d924 build: make llgen, cltest, gentests call build.Do 2024-11-26 13:17:36 +08:00
xushiwei
25bc84817a Merge pull request #880 from visualfc/valist
ssa: closure use org signature
2024-11-26 13:02:30 +08:00
visualfc
8fb0dfad94 ssa: abiNamed use NameOf 2024-11-26 12:46:11 +08:00
visualfc
c2138037d2 internal/lib/reflect: call variadic check 2024-11-26 12:46:11 +08:00
visualfc
fadd64c1e9 ssa: cvtClosure remove closureCtx param 2024-11-26 12:46:11 +08:00
visualfc
4552691aed ssa: toLLVMFunc by NameValist 2024-11-26 12:46:11 +08:00
xushiwei
bab5c0589f Merge pull request #883 from luoliwoshang/ci/llcppg
ci:install llcppg dependent
2024-11-26 12:44:31 +08:00
luoliwoshang
2a2c614eb4 ci:remove pre-install pkg-config 2024-11-26 11:52:35 +08:00
luoliwoshang
12529ec81e ci:install llcppg dependent 2024-11-26 11:13:25 +08:00
luoliwoshang
0179609a49 ci:trigger for sub-repositories 2024-11-26 10:56:37 +08:00
xushiwei
860c551aa6 Merge pull request #876 from cpunion/fix-demo-test
Enable demo test
2024-11-25 12:15:33 +08:00
Li Jie
1ba3474a5a lib: impl syscall.Faccesat 2024-11-25 12:05:12 +08:00
Li Jie
f26c283541 ci: enable demo result checking 2024-11-25 12:05:12 +08:00
Li Jie
56e9dab2ce ci: test demo with python 3.12 2024-11-25 12:05:12 +08:00
Li Jie
b1fcae5cec cgo: only scan non-directories and ignore *_test.c 2024-11-25 12:05:12 +08:00
xushiwei
93245ac37a Merge pull request #879 from cpunion/fix-type-patching
Fix type patching
2024-11-25 11:52:48 +08:00
Li Jie
3f795e44c7 demo: sizeof sync.Mutex 2024-11-25 11:36:26 +08:00
Li Jie
e732e5158e cl: fix package patching 2024-11-25 11:36:26 +08:00
xushiwei
2f5c033f09 Merge pull request #878 from cpunion/update-code-gen
test: update generated code
2024-11-25 11:32:17 +08:00
Li Jie
6099369019 test: update generated code 2024-11-25 11:18:46 +08:00
xushiwei
8d2b65386c Merge pull request #874 from cpunion/fix-closure
ssa: fix wrong reflect type of closure
2024-11-25 11:05:04 +08:00
xushiwei
ed835225cf Merge pull request #875 from cpunion/fix-alloc-in-loop
Reduce alloca
2024-11-25 10:54:28 +08:00
Li Jie
43c1bc8d5f ssa: compile go string constant without alloca 2024-11-24 15:29:20 +08:00
Li Jie
17832fe18c ssa: fix type of ChanOp.Size 2024-11-24 15:21:32 +08:00
Li Jie
252f3f0bd6 ssa: fix closure type 2024-11-24 10:54:00 +08:00
xushiwei
e042aad819 Merge pull request #873 from luoliwoshang/workflow/pkgconf
ci: remove pre-installed pkg-config
2024-11-23 19:41:13 +08:00
luoliwoshang
9966daf0cf ci: remove pre-installed pkg-config 2024-11-23 19:27:11 +08:00
xushiwei
daf5e9cccf Merge pull request #871 from luoliwoshang/doc/ssizet
doc:ssize_t
2024-11-22 23:13:39 +08:00
xushiwei
bf63d731d3 Merge pull request #870 from luoliwoshang/llcppsigfetch/otherdefinetype
llcppsigfetch:typedef refer same struct & remove tokenize check for underlying
2024-11-22 23:12:34 +08:00
luoliwoshang
12abfc0fcf doc:ssize_t 2024-11-21 21:38:11 +08:00
xushiwei
dea1b520f7 Merge pull request #852 from visualfc/reflect.func
internal/lib/reflect: support method call
2024-11-21 07:42:18 +08:00
luoliwoshang
a5c268491e llcppsigfetch: test typedef anonymous enum with multiple type names 2024-11-20 17:56:44 +08:00
luoliwoshang
bf34f553bb llcppsigfetch:typedef refer same anony struct & fix typedef 's underlying token out of bound 2024-11-20 16:58:18 +08:00
luoliwoshang
97c61404ca llcppsigfetch:test config 2024-11-20 14:09:58 +08:00
visualfc
c40d9f54a2 internal/lib/reflect: value.call support multi ret 2024-11-19 20:51:08 +08:00
visualfc
5e08593358 internal/lib/reflect: toFFIArg check interface 2024-11-19 20:51:08 +08:00
visualfc
1f06b12f86 internal/lib/reflect: toFFIArg 2024-11-19 20:51:08 +08:00
visualfc
c7351f724e internal/lib/reflect: toFFIType 2024-11-19 20:51:08 +08:00
visualfc
1851bce497 internal/lib/reflect: Value.InterfaceData 2024-11-19 20:51:08 +08:00
visualfc
5fb8503fd2 internal/lib/reflect: Value.IsZero 2024-11-19 20:51:08 +08:00
visualfc
792716eefc internal/lib/reflect: Value.SetZero 2024-11-19 20:51:08 +08:00
visualfc
15a6c779b8 internal/lib/reflect: Value.New 2024-11-19 20:51:08 +08:00
visualfc
93d24e7106 internal/lib/reflect: Value.UnsafePointer 2024-11-19 20:51:08 +08:00
visualfc
b8a185c112 internal/lib/reflect: Value.Slice Value.Slice3 2024-11-19 20:51:08 +08:00
visualfc
e242e65569 internal/lib/reflect: Value.SetLen Value.SetCap 2024-11-19 20:51:08 +08:00
visualfc
62ab33a434 internal/lib/reflect: Value.Len Value.Cap 2024-11-19 20:51:08 +08:00
visualfc
f403916ef8 internal/lib/reflect: Value.bytesSlow 2024-11-19 20:51:08 +08:00
visualfc
38f1585ac6 internal/lib/reflect: Value.Float Value.Bool 2024-11-19 20:51:08 +08:00
visualfc
1f757270d9 internal/lib/reflect: impl Value.Field 2024-11-19 20:51:08 +08:00
visualfc
e6de8401bf internal/lib/reflect: makeMethodValue 2024-11-19 20:51:08 +08:00
visualfc
df2e34ac51 internal/lib/reflect: call.method 2024-11-19 20:51:08 +08:00
visualfc
7bbd3a7e36 internal/lib/reflect: TypeOf check closure 2024-11-19 20:51:07 +08:00
visualfc
85a736d49b internal/lib/reflect: closure keep orgtype 2024-11-19 20:51:07 +08:00
xushiwei
f9eb313f7c Merge pull request #869 from cpunion/fix-linking
Fix linking args, force doc test run on current ref
2024-11-19 17:46:14 +08:00
Li Jie
9cec486a1b build: compatible spaces in path outputted from pkg-config 2024-11-19 16:43:45 +08:00
Li Jie
7734c654a7 doc: make doc test use current ref 2024-11-19 10:50:49 +08:00
Li Jie
8e5fff6c5f build: fix linking args and llgo install 2024-11-19 10:50:45 +08:00
xushiwei
faa9a740db Merge pull request #866 from cpunion/cgo
Full cgo support
2024-11-16 05:33:16 +08:00
xushiwei
70e39e9902 Merge pull request #867 from luoliwoshang/c/clang/file2loc
c/clang:file to loc
2024-11-16 05:31:22 +08:00
Li Jie
9f0b3963cb cgo: support full cgo tags 2024-11-15 16:08:24 +08:00
xushiwei
7ec2ce851c Merge pull request #868 from goplus/dependabot/github_actions/codecov/codecov-action-5
build(deps): bump codecov/codecov-action from 4 to 5
2024-11-15 12:54:29 +08:00
dependabot[bot]
94ee4223d2 build(deps): bump codecov/codecov-action from 4 to 5
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-15 00:23:06 +00:00
Li Jie
a64f4219e9 cgo: full supports cgo preambles and auto compile c files 2024-11-14 23:44:25 +08:00
luoliwoshang
78e96cc312 c/clang:file to loc 2024-11-14 14:31:20 +08:00
Li Jie
89b111edca cgo: examples 2024-11-13 20:32:12 +08:00
Li Jie
ec38943c53 cl: compile cgo 2024-11-13 20:32:08 +08:00
xushiwei
ea654ef235 Merge pull request #865 from luoliwoshang/clang/include
clang:included & system header
2024-11-12 22:48:58 +08:00
luoliwoshang
288b705450 clang:included & system header 2024-11-12 20:26:33 +08:00
xushiwei
73ca579056 Merge pull request #863 from tsingbx/llcppsigfetch/c.Printf
fix llcppsigfetch: invalid memory address or nil pointer dereference
2024-11-12 15:29:38 +08:00
xushiwei
8b5d7dc181 Merge pull request #859 from goplus/dependabot/github_actions/actions/setup-go-5
build(deps): bump actions/setup-go from 4 to 5
2024-11-12 10:53:14 +08:00
xushiwei
f05f6294cd Merge pull request #861 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.2
build(deps): bump github.com/goplus/gogen from 1.16.1 to 1.16.2
2024-11-12 10:52:55 +08:00
tsingbx
b2c466cf3f fix llcppsigfetch: invalid memory address or nil pointer dereference 2024-11-12 09:37:22 +08:00
dependabot[bot]
da1b9a0e91 build(deps): bump github.com/goplus/gogen from 1.16.1 to 1.16.2
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.1 to 1.16.2.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.1...v1.16.2)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 00:38:39 +00:00
dependabot[bot]
6cbb5a9215 build(deps): bump actions/setup-go from 4 to 5
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 00:36:37 +00:00
xushiwei
cfdbb86bfa Merge pull request #856 from cpunion/doc-and-fmt-test
Make docs testable
2024-11-08 16:34:21 +08:00
Li Jie
d61783b2c0 doc: install numpy in virtualenv to run test 2024-11-07 11:34:58 +08:00
Li Jie
65c1e1b9e5 ci: build chore/_xtool/... 2024-11-07 11:03:07 +08:00
Li Jie
17d509a45a doc: make doc testable 2024-11-07 11:03:01 +08:00
Li Jie
c7649766fd c: fix format 2024-11-07 09:47:22 +08:00
xushiwei
c0ec5e53ba Merge pull request #855 from luoliwoshang/libffi
workflow:libffi
2024-11-07 08:01:05 +08:00
xushiwei
a0a18017e8 Merge pull request #851 from luoliwoshang/c/clang/sliceran
c/clang:demo common iterate
2024-11-07 08:00:11 +08:00
xushiwei
411b84fcc2 Merge pull request #854 from luoliwoshang/c/clang/loc2cursor
c/clang:location to cursor
2024-11-07 07:59:43 +08:00
xushiwei
e499eeb8cc Merge pull request #857 from cpunion/fix-pydump
chore: fix types error in pydump
2024-11-07 07:59:15 +08:00
Li Jie
803d1de5db chore: fix types error in pydump 2024-11-06 11:30:35 +08:00
luoliwoshang
fc8117c8e7 workflow:libffi 2024-11-05 17:15:20 +08:00
luoliwoshang
8bef0ede1b c/clang:location to cursor 2024-11-04 15:50:05 +08:00
luoliwoshang
88128cde48 c/clang:demo common iterate 2024-11-04 09:55:35 +08:00
xushiwei
d0217e62f0 Merge pull request #850 from luoliwoshang/ssa/slicelen
ssa:fit unsafe.slice int size
2024-11-04 06:49:34 +08:00
xushiwei
bba680b636 Merge pull request #849 from luoliwoshang/c/clang/visitinclude
c/clang:include
2024-11-04 06:45:27 +08:00
luoliwoshang
feb914b5c4 ssa:fit slice int size 2024-11-01 19:54:44 +08:00
luoliwoshang
0a65ea34f3 c/clang:include 2024-11-01 18:49:48 +08:00
xushiwei
bf299edfc7 Merge pull request #847 from visualfc/reflect.call
[WIP]  internal/lib/reflect: implement reflect.call
2024-11-01 17:41:57 +08:00
visualfc
6b0122547e reflect.call: internal/abi: TFlagClosure, internal/lib/reflect: flagClosure. 2024-11-01 15:27:40 +08:00
xushiwei
88c0e149b5 Merge pull request #793 from visualfc/abitypes
ssa: fix gocvt named recurs for typeargs. support sync.Map
2024-10-30 22:00:22 +08:00
visualfc
38091b2021 ssa: func Instantiate 2024-10-30 21:39:30 +08:00
visualfc
ce87f293aa ssa: fix map key has typeargs 2024-10-30 20:22:05 +08:00
visualfc
dca028a84f ssa: fix goTypes.cvtNamed recurs for typeargs 2024-10-30 20:22:05 +08:00
visualfc
be3c4ab24a ssa: cache types named in runtime 2024-10-30 20:22:05 +08:00
xushiwei
67c9a14902 Merge pull request #846 from visualfc/closureiface
ssa: fix closure type
2024-10-30 11:02:43 +08:00
visualfc
014bdb795f ssa: program.Closure, removeCtx for MakeClosure 2024-10-30 10:42:32 +08:00
visualfc
df7e8b2e64 cl/cltest: TestCompileEx check debug flag 2024-10-30 10:18:58 +08:00
visualfc
2b5fdd3548 ssa: fix closure type 2024-10-29 20:50:02 +08:00
xushiwei
e92a0eb901 Merge pull request #806 from cpunion/llvm-debug
Debug: fix struct vars debug, params modication, supports expressions, lexical scope/lifecycle
2024-10-29 11:09:00 +08:00
xushiwei
e72a67f5de Merge pull request #788 from luoliwoshang/llcppsymg/classname
llcppsymg:refine class fetch,test case,-v
2024-10-28 11:00:55 +08:00
xushiwei
65dc291ff5 Merge pull request #812 from luoliwoshang/llcppsigfetch/refine
llcppsigfetch:cross-platform,log,fix bugs
2024-10-28 10:54:33 +08:00
xushiwei
0bfc190a86 Merge pull request #845 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.1
build(deps): bump github.com/goplus/gogen from 1.16.0 to 1.16.1
2024-10-28 10:53:47 +08:00
dependabot[bot]
f8303f2e7a build(deps): bump github.com/goplus/gogen from 1.16.0 to 1.16.1
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.0 to 1.16.1.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.0...v1.16.1)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-28 00:44:02 +00:00
张之阳
8ad72b167c Merge pull request #124 from luoliwoshang/llcppsymg/underprefix
llcppsymg:underprefix
2024-10-26 18:56:56 +08:00
luoliwoshang
7747082ae8 llcppsymg:remove one leading underscore only in mac 2024-10-26 18:43:14 +08:00
luoliwoshang
a7727adca2 llcppsigfetch:remove one leading underscore only in mac 2024-10-26 13:09:30 +08:00
xushiwei
028b53816d Merge pull request #844 from luoliwoshang/c/clang/reference
c/clang:referenced
2024-10-25 11:41:40 +08:00
张之阳
5a77117a9b Merge pull request #116 from luoliwoshang/llcppsigfetch/enum_anony
llcppsigfetch:anonymous enumdecl
2024-10-24 17:50:09 +08:00
luoliwoshang
05777019c8 llcppsigfetch:anony enum 2024-10-24 17:46:33 +08:00
luoliwoshang
7ebaad5099 c/clang:referenced 2024-10-24 09:46:52 +08:00
张之阳
09885c8f41 Merge pull request #112 from luoliwoshang/llcppsigfetch/closure
llcppsigfetch:use closure refine collection
2024-10-23 16:06:28 +08:00
luoliwoshang
4f5ebb279d llcppsigfetch:refine field collection 2024-10-23 16:02:39 +08:00
luoliwoshang
91ebf88c97 llcppsigfetch:use fmt to log because linux nil defer of log 2024-10-23 15:44:41 +08:00
luoliwoshang
a608c51e36 llcppsigfetch:fix fopen's return type nil 2024-10-23 15:44:41 +08:00
luoliwoshang
3877dcf83a llcppsigfetch:refine log out 2024-10-23 15:44:41 +08:00
luoliwoshang
72d176b77a llcppsigfetch:-v 2024-10-23 15:44:41 +08:00
luoliwoshang
8840968e07 llcppsigfetch:refine args parse 2024-10-23 15:44:41 +08:00
luoliwoshang
b6b889bff6 llcppsigfetch:remove leading underscores 2024-10-23 15:44:41 +08:00
luoliwoshang
a30bdcbb50 gogensig:unsigned & signed char 2024-10-23 15:44:41 +08:00
luoliwoshang
82275d49a6 llcppg:pipe writer close 2024-10-23 15:44:41 +08:00
luoliwoshang
ee335de222 llcppsigfetch:use stdin 2024-10-23 15:44:41 +08:00
luoliwoshang
01bf7c8c38 llcppsymg & llcppsigfetch parse args 2024-10-23 15:44:41 +08:00
xushiwei
5529a1b0b3 Merge pull request #842 from visualfc/libffi
[WIP] c/ffi x/ffi: import libffi
2024-10-23 14:44:57 +08:00
visualfc
363be18599 x/ffi: wrap c/ffi 2024-10-23 11:44:34 +08:00
xushiwei
ae8ad3b68b Merge pull request #837 from cpunion/const-conv
ssa: fix int constant type conversion
2024-10-23 10:58:08 +08:00
xushiwei
348b850e36 Merge pull request #838 from cpunion/unsafe-fix
fix unsafe
2024-10-23 10:57:22 +08:00
visualfc
92c267758e c/ffi: add _demo 2024-10-23 10:53:18 +08:00
visualfc
b7d1ab6105 c/ffi: import libffi 2024-10-23 10:53:18 +08:00
xushiwei
f7f1b4f594 Merge pull request #775 from visualfc/freevars
cl: function fix freevars cache
2024-10-23 10:49:51 +08:00
xushiwei
6492bea846 Merge pull request #824 from visualfc/chkabi
ssa: abi check interface method
2024-10-23 10:45:06 +08:00
Li Jie
b1cb89b0c2 test: unsafe.{Add, Alignof, Offsetof, String, StringData, SliceData, Slice} 2024-10-21 18:53:05 +08:00
Li Jie
7ecd98b0a0 ssa: fix type of unsafe.SliceData 2024-10-21 18:53:00 +08:00
Li Jie
7d7d4db329 ssa: fix int constant type conversion 2024-10-21 18:50:32 +08:00
luoliwoshang
e6bfe1fc88 llcppsymg:refine args 2024-10-21 18:48:56 +08:00
luoliwoshang
151d3a9610 llcppsymg:libs,cflags parse 2024-10-21 18:48:56 +08:00
luoliwoshang
905ed36afd llcppsymg:symbol debug log 2024-10-21 18:48:56 +08:00
luoliwoshang
7fe9c9366e llcppsymg:linux sys path 2024-10-21 18:48:56 +08:00
luoliwoshang
d5237d1a07 llcppsymg:multiple dylib path search 2024-10-21 18:48:56 +08:00
luoliwoshang
7bd3b29a11 llcppsymg:remove leading underscores 2024-10-21 18:48:56 +08:00
luoliwoshang
60aa74257f chore:remove folder 2024-10-21 18:48:56 +08:00
luoliwoshang
ca0492d997 llcppsymg:config & clangutil test
llcppsymg:clangutil test
2024-10-21 18:48:56 +08:00
luoliwoshang
944133de6e llcppsymg:symbol generate test
llcppsymg:symbo test

llcppsymg:exist symb file test

llcppsymg:GenSymbolTabledata

llcppsymg:GenSymbolTableData test

llcppsymg:full symg operation test
2024-10-21 18:48:56 +08:00
luoliwoshang
174fdd40da llcppsymg:refine dylib parse 2024-10-21 18:48:56 +08:00
luoliwoshang
ffa823f748 llcppsymg:gendylib path test
llcppsymg:headerpath test
2024-10-21 18:48:56 +08:00
luoliwoshang
a83f7a822e llcppsymg:refine logic & parse symbol test 2024-10-21 18:48:56 +08:00
luoliwoshang
29d527bee1 llcppsymg:refine classname fetch 2024-10-21 18:48:56 +08:00
luoliwoshang
75e282c2ac llcppsymg & llcppsigfetch parse args 2024-10-21 18:46:57 +08:00
xushiwei
8419d9114b Merge pull request #839 from cpunion/fix-gh-action
ci: fix python deps install
2024-10-21 18:41:33 +08:00
Li Jie
1c414af7b9 ci: instead pip3 with pip3.12 2024-10-21 18:34:44 +08:00
Li Jie
834e8c64c5 ssa: unsafe.Add 2024-10-21 17:31:58 +08:00
xushiwei
1b3bb86546 Merge pull request #828 from luoliwoshang/os/errno
os:fix os.Errno 's nil pointer derefer in linux
2024-10-21 13:44:56 +08:00
xushiwei
aa560f42e7 Merge pull request #833 from visualfc/funcaddr
cl: instr funcAddr support typec funclit
2024-10-19 16:06:32 +08:00
visualfc
4e69cd28cd cl: instr funcAddr support typec funclit 2024-10-17 20:30:39 +08:00
xushiwei
5f0e30e17a Merge pull request #829 from luoliwoshang/xtool/nm
xtool/nm:flags option & symbol version
2024-10-16 18:11:40 +08:00
luoliwoshang
d682771c35 xtool/nm:symbol version 2024-10-15 15:29:30 +08:00
luoliwoshang
ace3c3e421 nmdump:flags option 2024-10-15 12:01:42 +08:00
luoliwoshang
94005b0c22 xtool/nm:flags option 2024-10-15 10:40:25 +08:00
luoliwoshang
e9177c8932 os/errno:fix os.Errno 's nil pointer derefer in linux 2024-10-12 16:30:14 +08:00
visualfc
d62c2d913e ssa: abi check interface method 2024-10-12 15:59:10 +08:00
xushiwei
9ea88fe247 Merge pull request #827 from luoliwoshang/os/stat
[wip] os:correct error of noexist file & os.Error 's nil pointer dereference in linux
2024-10-12 11:28:32 +08:00
xushiwei
e0867a5d11 Merge pull request #826 from visualfc/reflect_value
internal/lib/reflect: fix valueInterface
2024-10-12 11:27:20 +08:00
luoliwoshang
ae91101ea1 os:correct error of noexist file 2024-10-11 16:22:14 +08:00
visualfc
515057c41a internal/lib/reflect: Value.Type 2024-10-11 09:14:36 +08:00
visualfc
d946ba426e internal/lib/reflect: fix valueInterface 2024-10-11 07:43:46 +08:00
xushiwei
07874cf77f Merge pull request #816 from luoliwoshang/c/lua/debug
c/lua:debug
2024-10-10 15:31:48 +08:00
xushiwei
1d9f9e838b Merge pull request #817 from cpunion/remove-inline-py-methods
py: remove static methods
2024-10-10 15:31:01 +08:00
xushiwei
101691e970 Merge pull request #822 from goplus/dependabot/github_actions/thollander/actions-comment-pull-request-3
build(deps): bump thollander/actions-comment-pull-request from 2 to 3
2024-10-10 15:30:05 +08:00
dependabot[bot]
e2498c31ea build(deps): bump thollander/actions-comment-pull-request from 2 to 3
Bumps [thollander/actions-comment-pull-request](https://github.com/thollander/actions-comment-pull-request) from 2 to 3.
- [Release notes](https://github.com/thollander/actions-comment-pull-request/releases)
- [Commits](https://github.com/thollander/actions-comment-pull-request/compare/v2...v3)

---
updated-dependencies:
- dependency-name: thollander/actions-comment-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-10 00:34:41 +00:00
Li Jie
9d8c6122cc py: remove inline methods 2024-10-05 23:10:00 +08:00
Li Jie
227dda38a2 lldb: fix slice index expression 2024-10-05 17:46:54 +08:00
luoliwoshang
e2091413ea c/lua:extraspace 2024-10-04 15:37:28 +08:00
luoliwoshang
4976e82f0f c/lua:debug 2024-10-04 15:37:28 +08:00
xushiwei
5e949d2c6f Merge pull request #809 from visualfc/maplen
runtime: fix map len and chan len/cap
2024-10-04 11:34:49 +08:00
xushiwei
fec7688241 Merge pull request #810 from visualfc/py
py: remove llgo_autogen.lla
2024-10-01 06:07:04 +08:00
Li Jie
2732f6036e debug: refactor test script 2024-09-30 16:38:37 +08:00
Li Jie
387c44031a ci: show lldb tests details 2024-09-30 16:38:37 +08:00
Li Jie
6cbd1c5fb1 debug: switch scope test 2024-09-30 16:38:37 +08:00
Li Jie
447b9e1ea7 debug: disable failed tests 2024-09-30 16:38:25 +08:00
Li Jie
be08bcaafc debug: compile to dwarf-4 2024-09-30 15:22:38 +08:00
Li Jie
1b5e8e0181 ci: return non-zero if run lldb tests failed 2024-09-30 15:10:12 +08:00
visualfc
d2ffbd0395 cl: function fix freevars cache 2024-09-30 10:29:38 +08:00
Li Jie
88cb607975 debug: supports scope (if, for) 2024-09-30 10:15:47 +08:00
Li Jie
e392956e2a debug: fix basic types 2024-09-27 21:36:12 +08:00
Li Jie
3028081fa2 chore: fix exit code in runtest.sh 2024-09-27 21:36:12 +08:00
Li Jie
4003c59471 ssa: debug info types.Named -> typedef 2024-09-27 21:36:12 +08:00
Li Jie
2e042f0c59 lldb: fix struct vars debugging 2024-09-27 21:36:08 +08:00
visualfc
9a4238d4e2 py: remove llgo_autogen.lla 2024-09-27 10:37:41 +08:00
visualfc
c184dc8d2f runtime: fix map len and chan len/cap 2024-09-25 20:51:58 +08:00
xushiwei
32f41a04ac Merge pull request #757 from luoliwoshang/llcppg/ast/mangle
llcppg/ast:func mangle name
2024-09-25 11:05:06 +08:00
xushiwei
4b8174f75a Merge pull request #803 from luoliwoshang/llcppsigfetch/output
llcppsigfetch:refine
2024-09-24 19:08:53 +08:00
luoliwoshang
313e14bc54 llcppsigfetch:refine mock gettype 2024-09-24 15:09:03 +08:00
luoliwoshang
7aca31992b llcppsigfetch:reuse clangutil 2024-09-24 14:43:33 +08:00
Li Jie
56f53e508f lldb: add more tests 2024-09-24 14:18:32 +08:00
Li Jie
6c18dc63aa build: enable ssa.GlobalDebug when LLGO_DEBUG=1 enabled, enable ssa.NaiveForm when LLGO_OPTIMIZED=0 2024-09-24 14:16:49 +08:00
luoliwoshang
7b498065b5 llcppsigfetch:use the closure in visitTop & enumtype 2024-09-24 12:22:01 +08:00
luoliwoshang
81bd225ff7 llcppsigfetch:keep line break 2024-09-24 11:26:34 +08:00
luoliwoshang
074090a0aa llcppsigfetch:config the output 2024-09-24 11:26:34 +08:00
Li Jie
3fcbcca8e4 lldb: fix log output when exit 2024-09-23 21:14:26 +08:00
xushiwei
dbaf12b043 Merge pull request #769 from visualfc/lib_reflect
[wip] lib reflect
2024-09-23 00:37:28 +08:00
visualfc
9eb9b48534 internal/lib/reflect: type.Field FieldByIndex FieldByName 2024-09-22 20:56:15 +08:00
visualfc
e085fd1d57 internal/lib/reflect: type.Name type.Elem 2024-09-22 20:44:57 +08:00
visualfc
9cc71b320b internal/lib/reflect: type.method 2024-09-22 20:44:55 +08:00
visualfc
7b74cf1ab9 internal/lib/reflect: interface.method 2024-09-22 20:43:40 +08:00
visualfc
fb0c0e07f7 internal/lib/reflect: reflect.pointer 2024-09-22 20:43:40 +08:00
Li Jie
c6bb4a23ae ssa: add debug info of function return type 2024-09-22 17:43:31 +08:00
Li Jie
70e271959b lldb: fix runlldb.sh to load llgo plugin 2024-09-22 14:57:21 +08:00
Li Jie
379abeb262 lldb: support expression includes dereference, parentheses 2024-09-22 14:57:16 +08:00
xushiwei
9e884847b1 Merge pull request #794 from cpunion/llvm-debug
ssa: add llvm debug info
2024-09-22 12:08:16 +08:00
Li Jie
5dadf9a087 lldb: skip some fail cases 2024-09-22 11:52:26 +08:00
Li Jie
c0630b782a ci: run lldb test 2024-09-22 11:52:26 +08:00
Li Jie
62beb73aa2 x 2024-09-22 11:52:26 +08:00
Li Jie
7b6fe0159f lldb: fix shellcheck warning 2024-09-22 11:52:26 +08:00
Li Jie
dad22b1686 cl: switch debug symbols with LLGO_DEBUG 2024-09-22 11:52:23 +08:00
xushiwei
a715a51865 Merge pull request #780 from luoliwoshang/llcppsymg/language
llcppsymg:parse c / c++ &  output  func proto
2024-09-22 08:03:19 +08:00
xushiwei
d4ec2319f9 Merge pull request #683 from luoliwoshang/llcppsigfetch/basic
llcppsigfetch
2024-09-22 07:58:35 +08:00
Li Jie
88b980ac17 lldb: refactor plugin and test scripts 2024-09-21 10:03:49 +08:00
Li Jie
867c01d5e8 ssa: clean 2024-09-21 09:10:08 +08:00
luoliwoshang
c8a064af3e llcppsigfetch:handle unexpect tag 2024-09-21 01:52:19 +08:00
Li Jie
12439f2b99 lldb: debug info test, lldb plugin, readme 2024-09-21 00:11:06 +08:00
Li Jie
fb47ea301f lldb: set llvm.ident to "LLGo Compiler" 2024-09-20 23:40:58 +08:00
Li Jie
6adecbd7aa lldb: add llgo plugin 2024-09-20 23:40:13 +08:00
Li Jie
f71e34fd9f ssa: fix function and global var debug info scope 2024-09-20 17:14:27 +08:00
xushiwei
dfe89588f0 Merge pull request #787 from luoliwoshang/llcppsymg/filter
llcppsymg:filter public method
2024-09-20 15:51:57 +08:00
Li Jie
d89b68a279 cl: don't declare var of ssa.Alloc and ssa.FieldAddr 2024-09-20 12:20:46 +08:00
Li Jie
2a4a01cb7b lldb test: test params 2024-09-20 10:21:37 +08:00
luoliwoshang
c81b7f6bb4 llcppsymg:to camel 2024-09-20 10:16:00 +08:00
Li Jie
0c11afad7a lldb test: clean 2024-09-19 21:49:41 +08:00
Li Jie
d6b26c9975 lldb test: ctrl+d to next interactive, ctrl+c to break 2024-09-19 21:45:39 +08:00
Li Jie
98c628f3eb lldb test: fix formatting 2024-09-19 21:45:34 +08:00
Li Jie
36b2026075 run lldb tests 2024-09-19 20:31:05 +08:00
Li Jie
7c535ff1a3 ssa: complex type name 2024-09-19 20:24:01 +08:00
xushiwei
c6436ea6d1 Merge pull request #800 from hackerchai/feat/c-libuv-thread
feat(c/libuv): Implement thread related funcs
2024-09-19 18:52:35 +08:00
xushiwei
5a8dee3cbe Merge pull request #799 from hackerchai/fix/c-libuv-loop
fix(c/libuv): Add missing essential funcs for uv_loop_t & uv_req_t
2024-09-19 18:50:12 +08:00
xushiwei
d9450d6e12 Merge pull request #798 from spongehah/c/sysconf
c/sysconf
2024-09-19 18:48:41 +08:00
hackerchai
80377b3705 feat(c/libuv): Implement thread related funcs
Signed-off-by: hackerchai <i@hackerchai.com>
2024-09-19 18:44:38 +08:00
hackerchai
847a76b3a2 fix(c/libuv): Add missing essential funcs for uv_loop_t & uv_req_t
Signed-off-by: hackerchai <i@hackerchai.com>
2024-09-19 18:42:31 +08:00
luoliwoshang
2c3d46bb80 llcppsigfetch:order output 2024-09-19 16:49:05 +08:00
luoliwoshang
e0cb6d4531 llcppsigfetch:output fileset 2024-09-19 15:35:42 +08:00
luoliwoshang
78f0177ac4 llcppsymg:use clang's displayname with semantic parent to construct func proto for c/c++ 2024-09-19 14:33:53 +08:00
luoliwoshang
4688434c08 llcppsymg:parse with language config 2024-09-19 14:33:53 +08:00
luoliwoshang
8913eeb1c1 llcppsymg:translation unit util 2024-09-19 14:33:53 +08:00
Li Jie
75574e97cc ssa: fix debug info of local vars 2024-09-19 10:29:11 +08:00
Li Jie
f4089bc164 ssa: struct debug info creation supports resursive 2024-09-19 09:45:26 +08:00
Li Jie
b0f04d91bf cl: fix dbg.declare (and local var) 2024-09-18 23:47:48 +08:00
Li Jie
3b514d194c ssa: remove unused 2024-09-18 23:27:54 +08:00
Li Jie
3ba405383e ssa: fix type name of debug info 2024-09-18 23:04:09 +08:00
Li Jie
87f6c8087f ssa: debug info of global variable 2024-09-18 22:17:49 +08:00
Li Jie
90a83c8f11 ssa: debug info of function/closure 2024-09-18 21:14:04 +08:00
Li Jie
27f892a14b ssa: debug info of chan 2024-09-18 21:14:04 +08:00
Li Jie
bf4525d82d ssa: debug info of Map 2024-09-18 21:14:04 +08:00
Li Jie
6bfb1a7fff ssa: debug info of interface 2024-09-18 21:14:04 +08:00
Li Jie
a53ab7438c ssa: debug info of Array and Slice 2024-09-18 21:14:04 +08:00
Li Jie
d85a080f9b ssa: support string and pointer debug info, fix params debugging 2024-09-18 21:14:04 +08:00
Li Jie
4dbfc9483e support complex debug info 2024-09-18 21:14:04 +08:00
Li Jie
53097ab183 fix debug info of struct parameter, 2024-09-18 21:14:04 +08:00
Li Jie
9978a370f1 x 2024-09-18 21:14:04 +08:00
Li Jie
24995f46cb debug test cover more types 2024-09-18 21:14:04 +08:00
Li Jie
7ddc8c6aeb increase coverage rate 2024-09-18 21:14:04 +08:00
Li Jie
4a447f5c12 cover integers, floats, bool, array, complex 2024-09-18 21:14:04 +08:00
Li Jie
e56647f24d remove unused DILexicalBlock 2024-09-18 21:14:04 +08:00
Li Jie
25238b53c9 hide llvm types on DIBuilder methods 2024-09-18 21:14:04 +08:00
Li Jie
1ed798342a move debug test into _testdata 2024-09-18 21:14:04 +08:00
Li Jie
1d6eb07c62 generate debug with dwarf language C 2024-09-18 21:14:04 +08:00
Li Jie
8e3d76b7ea gentests and cltest supports flags.txt (currently just -dbg used) 2024-09-18 21:14:04 +08:00
Li Jie
d8838503b2 generate llvm.dbg.value 2024-09-18 21:14:04 +08:00
Li Jie
78b7742354 fix argNo with 1-based index 2024-09-18 21:14:04 +08:00
Li Jie
3d9dca47b8 fix dwarf language code 2024-09-18 21:14:04 +08:00
Li Jie
c06c96bc1f add types.Map debug info, more debug symbol tests 2024-09-18 21:14:04 +08:00
Li Jie
db128dbc40 test: debug symbols generation 2024-09-18 21:14:04 +08:00
Li Jie
d6f87a8254 rename debug info class/funcs 2024-09-18 21:14:04 +08:00
Li Jie
4c5f37db0f debug symbols switch 2024-09-18 21:14:04 +08:00
Li Jie
3e5338c902 ssa: add llvm debug info 2024-09-18 21:14:04 +08:00
spongehah
848b7c7a34 c/sysconf 2024-09-18 18:40:16 +08:00
xushiwei
4bf5dd15e9 Merge pull request #796 from luoliwoshang/c/lua/fn
c/lua:custom alloc
2024-09-18 12:04:06 +08:00
张之阳
d4273d8e3f remove redundant fn body 2024-09-17 09:01:44 +08:00
xushiwei
780347776b Merge pull request #795 from cpunion/memset
Use LLVM memset intrinsic for compatibility and performance
2024-09-17 08:44:50 +08:00
xushiwei
5dd6986ad4 Merge pull request #797 from luoliwoshang/c/realloc
c:realloc
2024-09-17 08:40:05 +08:00
luoliwoshang
51bf41009e c:realloc 2024-09-16 23:37:22 +08:00
luoliwoshang
4defe734e2 c/lua:custom alloc for state 2024-09-16 23:33:14 +08:00
luoliwoshang
e3cb4ebfdc c/lua:alloc 2024-09-16 23:30:35 +08:00
luoliwoshang
c6345279cc c/lua:table field operate 2024-09-16 22:16:01 +08:00
luoliwoshang
e5a9af9a31 c/lua:remove redundant 2024-09-16 09:51:55 +08:00
Li Jie
c0e1e31572 rebuild tests 2024-09-14 16:14:50 +08:00
Li Jie
1e58c365ed instead runtime.Zeroinit of memset to compatible build.NaiveForm 2024-09-14 15:44:36 +08:00
luoliwoshang
bf87b76adb llcppsigfetch:variadic order 2024-09-13 16:06:06 +08:00
luoliwoshang
c8e06b5837 llcppsigfetch:func mangled name 2024-09-13 16:02:00 +08:00
luoliwoshang
ee5cd06077 llcppsigfetch:distinguish collect doc&comment 2024-09-13 16:02:00 +08:00
luoliwoshang
140352b637 llcppsigfetch:avoid tab 2024-09-13 16:02:00 +08:00
luoliwoshang
b369321e2f llcppsigfetch:unexpect typedef record type's named anonymous record decl resolve to normal anonymous record refer 2024-09-13 16:02:00 +08:00
luoliwoshang
b9aaba7b16 llcppsigfetch:fix nil type of FuncNoProto in C mode 2024-09-13 16:02:00 +08:00
luoliwoshang
07519732a1 llcppsigfetch:based on language configuration analysis 2024-09-13 16:02:00 +08:00
luoliwoshang
ae71f3c186 llcppsigfetch:extract info command 2024-09-13 16:02:00 +08:00
luoliwoshang
e1236f9deb llcppsigfetch:typedef anonymous record type correct refer by __ANONY_ name 2024-09-13 16:02:00 +08:00
luoliwoshang
3c9bfb5b4d llcppsigfetch:determine unexpected named typedecl in typedef anonymous 2024-09-13 16:02:00 +08:00
luoliwoshang
86b50b0a93 llcppsigfetch:null processing 2024-09-13 16:02:00 +08:00
luoliwoshang
da6706cb93 llcppsigfetch:complex typedef decl 2024-09-13 16:02:00 +08:00
luoliwoshang
2842a109da llcppsigfetch:right reference 2024-09-13 16:02:00 +08:00
luoliwoshang
021ddefb10 llcppsigfetch:dump node type for unmarshal 2024-09-13 16:02:00 +08:00
luoliwoshang
7d0b47c5cb llcppsigfetch:field access & static field 2024-09-13 16:02:00 +08:00
luoliwoshang
9351a1f900 llcppsigfetch:anonymous elaborated type refer 2024-09-13 16:02:00 +08:00
luoliwoshang
0ac48369fe llcppsigfetch:variadic param 2024-09-13 16:02:00 +08:00
luoliwoshang
e57ee17532 llcppsigfetch:func pointer 2024-09-13 16:01:59 +08:00
luoliwoshang
a897683272 Use semantic parent to refactor scoping expression construction 2024-09-13 16:01:59 +08:00
luoliwoshang
38eb981d2c llcppsigfetch:remove redundant test case 2024-09-13 16:01:59 +08:00
luoliwoshang
b524472b9e llcppsigfetch:out of class method 2024-09-13 16:01:59 +08:00
luoliwoshang
fc04083cb2 llcppsigfetch:collect public methods 2024-09-13 16:01:59 +08:00
luoliwoshang
b1225951f2 llcppsigfetch:func inline & static 2024-09-13 16:01:59 +08:00
luoliwoshang
24fd2e1849 llcppsigfetch:free override cursor 2024-09-13 16:01:59 +08:00
luoliwoshang
5e5c975a9c llcppsigfetch:constructor,destructor,static,override,virtual 2024-09-13 16:01:59 +08:00
luoliwoshang
c6336e920f llcppsigfetch:qualified name whith tag 2024-09-13 16:01:59 +08:00
luoliwoshang
cd19625522 llcppsigfetch:enum type 2024-09-13 16:01:59 +08:00
luoliwoshang
3ac95a9213 llcppsigfetch:refactor type reference test logic 2024-09-13 16:01:59 +08:00
luoliwoshang
e57ea9b501 llcppsigfetch/chore:rename 2024-09-13 16:01:59 +08:00
luoliwoshang
14b335a51e llcppsigfetch:correct class scoping 2024-09-13 16:01:59 +08:00
luoliwoshang
319e746a55 llcppsigfetch:qualified name refer 2024-09-13 16:01:59 +08:00
luoliwoshang
eb4d721175 llcppsigfetch:tag expr 2024-09-13 16:01:59 +08:00
luoliwoshang
a4f850c0c6 llcppsigfetch:lvalue & rvalue refer 2024-09-13 16:01:59 +08:00
luoliwoshang
0a8e25b405 llcppsigfetch:simpilfy func test 2024-09-13 16:01:59 +08:00
luoliwoshang
1557a76225 llcppsigfetch:split test directory 2024-09-13 16:01:59 +08:00
luoliwoshang
d4fa379f11 llcppsigfetch:record type 2024-09-13 16:01:59 +08:00
luoliwoshang
e09c5fcb3c llcppsigfetch:TypedefDecl & Elaborated Type Refer 2024-09-13 16:01:59 +08:00
luoliwoshang
815fe25f2c llcppsigfetch:anonymous record name 2024-09-13 16:01:59 +08:00
luoliwoshang
5e5c84ba27 llcppsigfetch:json memory free 2024-09-13 16:01:59 +08:00
luoliwoshang
2974b23f26 llcppsigfetch:refine file handling, remove curFile field 2024-09-13 16:01:59 +08:00
luoliwoshang
697c21b120 llcppsigfetch:typedecl name 2024-09-13 16:01:59 +08:00
luoliwoshang
1f72a52015 llcppsigfetch:free token 2024-09-13 16:01:59 +08:00
luoliwoshang
43bcf1051d llcppsigfetch:union 2024-09-13 16:01:59 +08:00
luoliwoshang
bf8aa502f9 llcppsigfetch:marco tokens & refine test 2024-09-13 16:01:59 +08:00
luoliwoshang
f0e92343cb llcppsigfetch:complex 2024-09-13 16:01:59 +08:00
luoliwoshang
48efd6689e llcppsigfetch:conveter config 2024-09-13 16:01:59 +08:00
luoliwoshang
090e689689 llcppsigfetch:basic enum 2024-09-13 16:01:59 +08:00
luoliwoshang
9d16df5f25 llcppsigfetch:include 2024-09-13 16:01:59 +08:00
luoliwoshang
02651c93a7 llcppsigfetch:basic marco process 2024-09-13 16:01:59 +08:00
luoliwoshang
2b1d4b6672 llcppsigfetch:output result 2024-09-13 16:01:59 +08:00
luoliwoshang
9087dac6fe llcppsigfetch:basic class & struct 's process 2024-09-13 16:01:59 +08:00
luoliwoshang
762ed994c1 llcppsigfetch:Decl Comment 2024-09-13 16:01:59 +08:00
luoliwoshang
2c8a9d1160 llcppsigfetch:Scope Context 2024-09-13 16:01:59 +08:00
luoliwoshang
f613316046 chore:remove the capital of Path 2024-09-13 16:01:59 +08:00
luoliwoshang
6b1bc15f37 llcppsigfetch:Constant & Incomplete Array 2024-09-13 16:01:59 +08:00
luoliwoshang
9a77a0c201 llcppsigfetch:move type test 2024-09-13 16:01:59 +08:00
luoliwoshang
755cdbb238 llcppsigfetch:collect func param name 2024-09-13 16:01:59 +08:00
luoliwoshang
1996db4b95 llcppsigfetch:refine cjson dump logic 2024-09-13 16:01:59 +08:00
luoliwoshang
6297f69e70 llcppsigfetch:basic cjson dump for ast.File 2024-09-13 16:01:59 +08:00
luoliwoshang
a796f9f8a8 llcppsigfetch:tempfile converter option 2024-09-13 16:01:59 +08:00
luoliwoshang
0de9c57ade llcppsigfetch:builtin type convert 2024-09-13 16:01:59 +08:00
luoliwoshang
95dc01cdcb llcppsigfetch:basic fileset 2024-09-13 16:01:59 +08:00
luoliwoshang
364d3996f4 llcppsigfetch:basic process type 2024-09-13 16:01:59 +08:00
luoliwoshang
33af9e878b llcppsigfech:basic struct
llcppsigfetch:basic parse converter

llcppsigfetch:converter top decl

llcppg:converter test
2024-09-13 16:01:59 +08:00
xushiwei
9f8b9ea806 Merge pull request #784 from luoliwoshang/c/clang/displayname
c/clang:displayname & comment range
2024-09-13 15:37:57 +08:00
xushiwei
d53876ee1b Merge pull request #782 from visualfc/runtimetypes
cl: processPkg check runtimeTypes for generic method
2024-09-12 12:47:53 +08:00
xushiwei
4f654e81c8 Merge pull request #792 from visualfc/selects
runtime: fix multi chan recv/send select
2024-09-12 12:46:22 +08:00
visualfc
aa33ddcf19 runtime: fix multi chan recv/send select 2024-09-11 16:09:15 +08:00
xushiwei
c8a57676b4 Merge pull request #783 from cpunion/builtin-llgo-tag
llgen: builtin llgo tag
2024-09-11 11:00:08 +08:00
luoliwoshang
d0d2bc1996 llcppsymg:filter public method 2024-09-10 14:36:26 +08:00
luoliwoshang
2b8d2b0026 c/clang:comment range 2024-09-09 18:35:52 +08:00
luoliwoshang
735953a262 c/clang:displayname 2024-09-09 15:45:09 +08:00
Li Jie
1c686f10a1 llgen: builtin llgo tag 2024-09-09 13:52:15 +08:00
visualfc
b7088510c5 cl: remove checkInstanceNamed 2024-09-09 11:36:39 +08:00
visualfc
3bdb921ee5 cl: processPkg check runtimeTypes for generic method 2024-09-09 11:22:03 +08:00
赵英杰
170a6096b9 lib/time: patch div and Time.Round 2024-09-03 18:28:15 +08:00
luoliwoshang
0484d4bb77 llcppg/ast:func mangle name 2024-09-03 15:16:36 +08:00
903 changed files with 118989 additions and 31675 deletions

48
.github/actions/setup-deps/action.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: "Setup LLGO Dependencies"
description: "Install all required dependencies for LLGO"
inputs:
llvm-version:
description: "LLVM version to install"
required: true
default: "18"
runs:
using: "composite"
steps:
- name: Install macOS dependencies
if: runner.os == 'macOS'
shell: bash
run: |
brew update
brew install llvm@${{inputs.llvm-version}} bdw-gc openssl libffi
brew link --force libffi
echo "$(brew --prefix llvm@${{inputs.llvm-version}})/bin" >> $GITHUB_PATH
# Install optional deps for demos.
#
# NOTE: Keep this list updated as new deps are introduced.
opt_deps=(
cjson # for github.com/goplus/llgo/c/cjson
sqlite # for github.com/goplus/llgo/c/sqlite
python@3.12 # for github.com/goplus/llgo/py
)
brew install "${opt_deps[@]}"
- name: Install Ubuntu dependencies
if: runner.os == 'Linux'
shell: bash
run: |
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{inputs.llvm-version}} 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
sudo apt-get install -y llvm-${{inputs.llvm-version}}-dev clang-${{inputs.llvm-version}} libclang-${{inputs.llvm-version}}-dev lld-${{inputs.llvm-version}} pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev libunwind-dev
echo "/usr/lib/llvm-${{inputs.llvm-version}}/bin" >> $GITHUB_PATH
# Install optional deps for demos.
#
# NOTE: Keep this list updated as new deps are introduced.
opt_deps=(
libcjson-dev # for github.com/goplus/llgo/c/cjson
libsqlite3-dev # for github.com/goplus/llgo/c/sqlite
python3.12-dev # for github.com/goplus/llgo/py
)
sudo apt-get install -y "${opt_deps[@]}"

View File

@@ -0,0 +1,35 @@
name: 'Test Hello World'
description: 'Test Hello World with specific Go and module versions'
inputs:
go-version:
description: 'Go version being tested'
required: true
mod-version:
description: 'Go module version to use'
required: true
runs:
using: "composite"
steps:
- name: Test Hello World
shell: bash
run: |
echo "Testing with Go ${{ inputs.go-version }} and go.mod ${{ inputs.mod-version }}"
mkdir -p _test/helloworld && cd _test/helloworld
cat > go.mod << 'EOL'
module hello
go ${{ inputs.mod-version }}
EOL
cat > main.go << 'EOL'
package main
import (
"fmt"
"github.com/goplus/llgo/c"
)
func main() {
fmt.Println("Hello, LLGo!")
println("Hello, LLGo!")
c.Printf(c.Str("Hello, LLGo!\n"))
}
EOL
go mod tidy
llgo run .

3
.github/codecov.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
coverage:
ignore:
- "compiler/chore"

View File

@@ -17,3 +17,13 @@ updates:
directory: "/" # Location of package manifests
schedule:
interval: "daily"
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/compiler/" # Location of package manifests
schedule:
interval: "daily"
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/runtime/" # Location of package manifests
schedule:
interval: "daily"

75
.github/workflows/doc.yml vendored Normal file
View File

@@ -0,0 +1,75 @@
name: Docs
on:
push:
branches: [ "**" ]
pull_request:
branches: [ "**" ]
jobs:
doc_verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install embedme
run: npm install -g embedme
- name: Verify README.md embedded code
run: npx embedme --verify README.md
doc_test:
strategy:
matrix:
os:
- macos-latest
- ubuntu-24.04
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install dependencies on macOS
if: startsWith(matrix.os, 'macos')
run: |
set -e
set -x
source doc/_readme/scripts/install_macos.sh
- name: Install dependencies on Ubuntu
if: startsWith(matrix.os, 'ubuntu')
run: |
set -e
set -x
source doc/_readme/scripts/install_ubuntu.sh
- name: Install llgo
run: |
set -e
set -x
git() {
if [ "$1" = "clone" ]; then
# do nothing because we already have the branch
cd ..
else
command git "$@"
fi
}
source doc/_readme/scripts/install_llgo.sh
echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV
- name: Test doc code blocks
run: |
set -e
set -x
source doc/_readme/scripts/run.sh

30
.github/workflows/fmt.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Format Check
on:
push:
branches: [ "**" ]
pull_request:
branches: [ "**" ]
jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Check formatting
run: |
for dir in . compiler runtime; do
pushd $dir
if [ -n "$(go fmt ./...)" ]; then
echo "Some files are not properly formatted. Please run 'go fmt ./...'"
exit 1
fi
popd
done
echo "All files are properly formatted."

View File

@@ -5,12 +5,11 @@ name: Go
on:
push:
branches: [ "*" ]
branches: [ "**" ]
pull_request:
branches: [ "*" ]
branches: [ "**" ]
jobs:
test:
strategy:
matrix:
@@ -19,53 +18,15 @@ jobs:
- ubuntu-24.04
llvm: [18]
runs-on: ${{matrix.os}}
defaults:
run:
working-directory: compiler
steps:
- uses: actions/checkout@v4
- name: Install dependencies
if: startsWith(matrix.os, 'macos')
run: |
brew update
brew install llvm@${{matrix.llvm}} pkg-config bdw-gc openssl
echo "$(brew --prefix llvm@${{matrix.llvm}})/bin" >> $GITHUB_PATH
# Install optional deps for demos.
#
# NOTE: Keep this list updated as new deps are introduced.
opt_deps=(
cjson # for github.com/goplus/llgo/c/cjson
sqlite # for github.com/goplus/llgo/c/sqlite
python@3.12 # for github.com/goplus/llgo/py
)
brew install "${opt_deps[@]}"
- name: Install dependencies
if: startsWith(matrix.os, 'ubuntu')
run: |
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{matrix.llvm}} 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
sudo apt-get install -y llvm-${{matrix.llvm}}-dev clang-${{matrix.llvm}} lld-${{matrix.llvm}} pkg-config libgc-dev libssl-dev zlib1g-dev
echo "/usr/lib/llvm-${{matrix.llvm}}/bin" >> $GITHUB_PATH
# Install optional deps for demos.
#
# NOTE: Keep this list updated as new deps are introduced.
opt_deps=(
libcjson-dev # for github.com/goplus/llgo/c/cjson
libsqlite3-dev # for github.com/goplus/llgo/c/sqlite
python3.12-dev # for github.com/goplus/llgo/py
)
sudo apt-get install -y "${opt_deps[@]}"
- name: Install further optional dependencies for demos
run: |
wget -P ./_demo/llama2-c https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
py_deps=(
numpy # for github.com/goplus/llgo/py/numpy
torch # for github.com/goplus/llgo/py/torch
)
pip3 install --break-system-packages "${py_deps[@]}"
uses: ./.github/actions/setup-deps
with:
llvm-version: ${{matrix.llvm}}
- name: Clang information
run: |
@@ -76,7 +37,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: '1.23'
- name: Build
run: go build -v ./...
@@ -89,31 +50,7 @@ jobs:
if: startsWith(matrix.os, 'macos')
run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...
- name: Install
run: go install ./...
- name: LLGO tests
if: ${{!startsWith(matrix.os, 'ubuntu')}}
run: |
echo "Test result on ${{matrix.os}} with LLVM ${{matrix.llvm}}" > result.md
bash .github/workflows/test_llgo.sh
- name: Test demos
continue-on-error: true
run: bash .github/workflows/test_demo.sh
- name: Show test result
run: cat result.md
- name: PR comment with test result
uses: thollander/actions-comment-pull-request@v2
if: false
with:
filePath: result.md
comment_tag: test-result-on-${{matrix.os}}-with-llvm-${{matrix.llvm}}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{secrets.CODECOV_TOKEN}}
slug: goplus/llgo

145
.github/workflows/llgo.yml vendored Normal file
View File

@@ -0,0 +1,145 @@
# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
name: LLGo
on:
push:
branches: [ "**" ]
pull_request:
branches: [ "**" ]
jobs:
llgo-test:
strategy:
matrix:
os:
- macos-latest
- ubuntu-24.04
llvm: [18]
go: ['1.20', '1.21', '1.22', '1.23']
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Install dependencies
uses: ./.github/actions/setup-deps
with:
llvm-version: ${{matrix.llvm}}
- name: Install further optional dependencies for demos
run: |
wget -P ./_demo/llama2-c https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
py_deps=(
numpy # for github.com/goplus/llgo/py/numpy
torch # for github.com/goplus/llgo/py/torch
)
pip3.12 install --break-system-packages "${py_deps[@]}"
- name: Set up Go for build
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install
working-directory: compiler
run: |
go install ./...
echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV
- name: Set up Go for testing
uses: actions/setup-go@v5
with:
go-version: ${{matrix.go}}
- name: Verify Go version
run: |
go_version=$(go version | cut -d' ' -f3 | sed 's/go//')
if [[ "$go_version" != "${{matrix.go}}"* ]]; then
echo "Expected Go version ${{matrix.go}}, but got $go_version"
exit 1
fi
echo "Using Go version: $go_version"
- name: _xtool build tests
run: |
cd _xtool
llgo build -v ./...
- name: LLGO tests
if: ${{!startsWith(matrix.os, 'ubuntu')}}
run: |
echo "Test result on ${{matrix.os}} with LLVM ${{matrix.llvm}}" > result.md
bash ./.github/workflows/test_llgo.sh
- name: Test demos
run: |
# TODO(lijie): force python3-embed to be linked with python-3.12-embed
# Currently, python3-embed is python-3.13-embed, doesn't work with pytorch
# Will remove this after pytorch is fixed.
pcdir=$HOME/pc
mkdir -p $pcdir
libdir=$(pkg-config --variable=libdir python-3.12-embed)
echo "libdir: $libdir"
ln -s $libdir/pkgconfig/python-3.12-embed.pc $pcdir/python3-embed.pc
export PKG_CONFIG_PATH=$pcdir
bash .github/workflows/test_demo.sh
- name: Show test result
run: cat result.md
- name: LLDB tests
if: ${{startsWith(matrix.os, 'macos')}}
working-directory: compiler
run: |
echo "Test lldb with llgo plugin on ${{matrix.os}} with LLVM ${{matrix.llvm}}"
bash _lldb/runtest.sh -v
helloworld-test:
strategy:
matrix:
os: [ubuntu-24.04, macos-latest]
llvm: [18]
go: ['1.20', '1.21', '1.22', '1.23']
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Install dependencies
uses: ./.github/actions/setup-deps
with:
llvm-version: ${{matrix.llvm}}
- name: Set up Go 1.23 for building llgo
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install llgo
working-directory: compiler
run: |
go install ./...
echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV
- name: Set up Go for testing
uses: actions/setup-go@v5
with:
go-version: ${{matrix.go}}
- name: Test Hello World with go.mod 1.20
if: matrix.go == '1.20' || matrix.go == '1.21' || matrix.go == '1.22' || matrix.go == '1.23'
uses: ./.github/actions/test-helloworld
with:
go-version: ${{matrix.go}}
mod-version: '1.20'
- name: Test Hello World with go.mod 1.21
if: matrix.go == '1.21' || matrix.go == '1.22' || matrix.go == '1.23'
uses: ./.github/actions/test-helloworld
with:
go-version: ${{matrix.go}}
mod-version: '1.21'
- name: Test Hello World with go.mod 1.22
if: matrix.go == '1.22' || matrix.go == '1.23'
uses: ./.github/actions/test-helloworld
with:
go-version: ${{matrix.go}}
mod-version: '1.22'

View File

@@ -11,7 +11,7 @@ DARWIN_ARM64_LLVM_PREFIX=.sysroot/darwin/arm64/opt/homebrew/opt/llvm@18
mkdir -p "${DARWIN_AMD64_LLVM_PREFIX}" "${DARWIN_ARM64_LLVM_PREFIX}"
BREW_LLVM_FORMULA_JSON="$(mktemp)"
curl -fsSL https://formulae.brew.sh/api/formula/llvm.json > "${BREW_LLVM_FORMULA_JSON}"
curl -fsSL https://formulae.brew.sh/api/formula/llvm@18.json > "${BREW_LLVM_FORMULA_JSON}"
BREW_LLVM_AMD64_BOTTLE_URL=$(jq -r '.bottle.stable.files.sonoma.url' "${BREW_LLVM_FORMULA_JSON}")
BREW_LLVM_ARM64_BOTTLE_URL=$(jq -r '.bottle.stable.files.arm64_sonoma.url' "${BREW_LLVM_FORMULA_JSON}")
curl -fsSL -H "Authorization: Bearer QQ==" "${BREW_LLVM_AMD64_BOTTLE_URL}" | tar -xzf - --strip-components=2 -C "${DARWIN_AMD64_LLVM_PREFIX}"

View File

@@ -11,9 +11,18 @@ jobs:
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Cache Darwin sysroot
id: cache-sysroot
uses: actions/cache@v4
with:
path: |
.sysroot/darwin.tar.gz
key: darwin-sysroot-${{ runner.os }}-${{ hashFiles('.github/workflows/populate_darwin_sysroot.sh') }}
- name: Populate Darwin sysroot
if: steps.cache-sysroot.outputs.cache-hit != 'true'
run: bash .github/workflows/populate_darwin_sysroot.sh
- name: Create Darwin sysroot tarball
if: steps.cache-sysroot.outputs.cache-hit != 'true'
run: tar -czvf .sysroot/darwin.tar.gz -C .sysroot darwin
- name: Upload Darwin sysroot tarball
uses: actions/upload-artifact@v4
@@ -32,7 +41,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.20.x
go-version: 1.23.x
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Download Darwin sysroot tarball

View File

@@ -1,13 +1,13 @@
#!/bin/bash
set -e
# llgo run subdirectories under _demo and _pydemo
# llgo run subdirectories under _demo and _pydemo that contain *.go files
total=0
failed=0
failed_cases=""
for d in ./_demo/* ./_pydemo/*; do
total=$((total+1))
if [ -d "$d" ]; then
if [ -d "$d" ] && [ -n "$(ls "$d"/*.go 2>/dev/null)" ]; then
total=$((total+1))
echo "Testing $d"
if ! (cd "$d" && llgo run .); then
echo "FAIL"

3
.gitignore vendored
View File

@@ -26,6 +26,9 @@ build.dir/
# Test binary, built with `go test -c`
*.test
# Debug symbols
*.dSYM
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
*.swp

View File

@@ -16,7 +16,9 @@ before:
builds:
- id: llgo-darwin-amd64
dir: compiler
main: ./cmd/llgo
binary: bin/llgo
flags:
- -tags=darwin,amd64,byollvm
ldflags:
@@ -32,7 +34,9 @@ builds:
- darwin_amd64
mod_timestamp: "{{.CommitTimestamp}}"
- id: llgo-darwin-arm64
dir: compiler
main: ./cmd/llgo
binary: bin/llgo
flags:
- -tags=darwin,arm64,byollvm
ldflags:
@@ -48,7 +52,9 @@ builds:
- darwin_arm64
mod_timestamp: "{{.CommitTimestamp}}"
- id: llgo-linux-amd64
dir: compiler
main: ./cmd/llgo
binary: bin/llgo
flags:
- -tags=linux,amd64,byollvm
ldflags:
@@ -64,7 +70,9 @@ builds:
- linux_amd64
mod_timestamp: "{{.CommitTimestamp}}"
- id: llgo-linux-arm64
dir: compiler
main: ./cmd/llgo
binary: bin/llgo
flags:
- -tags=linux,arm64,byollvm
ldflags:
@@ -88,6 +96,7 @@ archives:
files:
- LICENSE
- README.md
- runtime
checksum:
name_template: "{{.ProjectName}}{{.Version}}.checksums.txt"

View File

@@ -24,7 +24,7 @@ How can these be achieved?
LLGo := Go + C + Python
```
LLGo is compatible with C and Python through the language's **Application Binary Interface (ABI)**, while LLGo is compatible with Go through its **syntax (source code)**.
LLGo is compatible with C and Python through the language's **Application Binary Interface (ABI)**, while LLGo is compatible with Go through its **syntax (source code)**. And here C doesn't just include C, but all languages that are ABI compatible with C, including C/C++, Objective-C, Swift, etc.
## C/C++ standard libary support
@@ -47,6 +47,8 @@ You can import a C/C++ standard library in LLGo!
Here is a simple example:
<!-- embedme doc/_readme/llgo_simple/simple.go -->
```go
package main
@@ -73,10 +75,12 @@ llgo run .
```
## How support C/C++ and Python
## How to support C/C++ and Python
LLGo use `go:linkname` to link an extern symbol througth its ABI:
<!-- embedme doc/_readme/llgo_call_c/call_c.go#L3-L6 -->
```go
import _ "unsafe" // for go:linkname
@@ -86,6 +90,8 @@ func Sqrt(x float64) float64
You can directly integrate it into [your own code](_demo/linkname/linkname.go):
<!-- embedme doc/_readme/llgo_call_c/call_c.go -->
```go
package main
@@ -101,6 +107,8 @@ func main() {
Or put it into a package (see [c/math](c/math/math.go)):
<!-- embedme doc/_readme/llgo_call_cmath/call_cmath.go -->
```go
package main
@@ -135,6 +143,8 @@ Note: For third-party libraries (such as pandas and pytorch), you still need to
Here is an example:
<!-- embedme doc/_readme/llgo_call_py/call_py.go -->
```go
package main
@@ -152,6 +162,8 @@ func main() {
It is equivalent to the following Python code:
<!-- embedme doc/_readme/llgo_call_py/call_math.py -->
```py
import math
@@ -163,6 +175,8 @@ Here, We call `py.Float(2)` to create a Python number 2, and pass it to Python
Let's look at a slightly more complex example. For example, we use `numpy` to calculate:
<!-- embedme doc/_readme/llgo_py_list/py_list.go -->
```go
package main
@@ -214,6 +228,7 @@ The currently supported libraries include:
* [c/bdwgc](https://pkg.go.dev/github.com/goplus/llgo/c/bdwgc)
* [c/cjson](https://pkg.go.dev/github.com/goplus/llgo/c/cjson)
* [c/clang](https://pkg.go.dev/github.com/goplus/llgo/c/clang)
* [c/ffi](https://pkg.go.dev/github.com/goplus/llgo/c/ffi)
* [c/libuv](https://pkg.go.dev/github.com/goplus/llgo/c/libuv)
* [c/llama2](https://pkg.go.dev/github.com/goplus/llgo/c/llama2)
* [c/lua](https://pkg.go.dev/github.com/goplus/llgo/c/lua)
@@ -235,7 +250,7 @@ Here are some examples related to them:
## Go syntax support
All Go syntax (not including `cgo`) is already supported. Here are some examples:
All Go syntax (including `cgo`) is already supported. Here are some examples:
* [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)
@@ -326,8 +341,8 @@ Here are the Go packages that can be imported correctly:
- [Go 1.20+](https://go.dev)
- [LLVM 18](https://llvm.org)
- [LLD 18](https://lld.llvm.org)
- [Clang 18](https://clang.llvm.org)
- [LLD 18](https://lld.llvm.org)
- [pkg-config 0.29+](https://www.freedesktop.org/wiki/Software/pkg-config/)
- [bdwgc/libgc 8.0+](https://www.hboehm.info/gc/)
- [OpenSSL 3.0+](https://www.openssl.org/)
@@ -340,24 +355,45 @@ Follow these steps to generate the `llgo` command (its usage is the same as the
### on macOS
<!-- embedme doc/_readme/scripts/install_macos.sh#L2-L1000 -->
```sh
brew update
brew install llvm@18 pkg-config bdw-gc openssl
brew install llvm@18 bdw-gc openssl cjson libffi pkg-config
brew install python@3.12 # optional
brew link --force libffi
go install -v github.com/goplus/llgo/cmd/llgo@latest
```
### on Linux (Debian/Ubuntu)
### on Linux
#### Debian/Ubuntu
<!-- embedme doc/_readme/scripts/install_ubuntu.sh#L2-L1000 -->
```sh
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-18 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
sudo apt-get install -y llvm-18-dev clang-18 lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev
sudo apt-get install -y llvm-18-dev clang-18 libclang-18-dev lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev libunwind-dev
sudo apt-get install -y python3.12-dev # optional
go install -v github.com/goplus/llgo/cmd/llgo@latest
```
#### Alpine Linux
```sh
apk add go llvm18-dev clang18-dev lld18 pkgconf gc-dev openssl-dev zlib-dev
apk add python3-dev # optional
apk add g++ # build only
export LLVM_CONFIG=/usr/lib/llvm18/bin/llvm-config
export CGO_CPPFLAGS="$($LLVM_CONFIG --cppflags)"
export CGO_CXXFLAGS=-std=c++17
export CGO_LDFLAGS="$($LLVM_CONFIG --ldflags) $($LLVM_CONFIG --libs all)"
go install -v -tags=byollvm -ldflags="-X github.com/goplus/llgo/xtool/env/llvm.ldLLVMConfigBin=$LLVM_CONFIG" github.com/goplus/llgo/cmd/llgo@latest
```
### on Windows
TODO
@@ -373,11 +409,15 @@ TODO
How do I generate these tools?
<!-- embedme doc/_readme/scripts/install_llgo.sh#L2-L1000 -->
```sh
git clone https://github.com/goplus/llgo.git
cd llgo
cd llgo/compiler
go install -v ./cmd/...
go install -v ./chore/... # compile all tools except pydump
cd chore/_xtool
export LLGO_ROOT=$PWD/..
cd ../_xtool
llgo install ./... # compile pydump
go install github.com/goplus/hdq/chore/pysigfetch@v0.8.1 # compile pysigfetch
```

View File

@@ -0,0 +1,31 @@
package async
import (
_ "unsafe"
)
type Void = [0]byte
type Future[T any] interface {
Then(cb func(T))
}
type future[T any] struct {
cb func(func(T))
}
func (f *future[T]) Then(cb func(T)) {
f.cb(cb)
}
func Async[T any](fn func(func(T))) Future[T] {
return &future[T]{fn}
}
func Run[T any](future Future[T]) T {
var ret T
future.Then(func(v T) {
ret = v
})
return ret
}

23
_demo/async/main.go Normal file
View File

@@ -0,0 +1,23 @@
package main
import (
"time"
"github.com/goplus/llgo/_demo/async/async"
"github.com/goplus/llgo/_demo/async/timeout"
)
func Sleep(i int, d time.Duration) async.Future[int] {
return async.Async(func(resolve func(int)) {
timeout.Timeout(d).Then(func(async.Void) {
resolve(i)
})
})
}
func main() {
async.Run(async.Async(func(resolve func(async.Void)) {
println("read file")
defer resolve(async.Void{})
}))
}

View File

@@ -0,0 +1,16 @@
package timeout
import (
"time"
"github.com/goplus/llgo/_demo/async/async"
)
func Timeout(d time.Duration) async.Future[async.Void] {
return async.Async(func(resolve func(async.Void)) {
go func() {
time.Sleep(d)
resolve(async.Void{})
}()
})
}

16
_demo/cgofull/bar.go Normal file
View File

@@ -0,0 +1,16 @@
package main
/*
#cgo CFLAGS: -DBAR
#include <stdio.h>
#include "foo.h"
static void foo(Foo* f) {
printf("foo in bar: %d\n", f->a);
}
*/
import "C"
func Bar(f *C.Foo) {
C.print_foo(f)
C.foo(f)
}

157
_demo/cgofull/cgofull.go Normal file
View File

@@ -0,0 +1,157 @@
package main
/*
#cgo windows,!amd64 CFLAGS: -D_WIN32
#cgo !windows CFLAGS: -D_POSIX
#cgo windows,amd64 CFLAGS: -D_WIN64
#cgo linux,amd64 CFLAGS: -D_LINUX64
#cgo !windows,amd64 CFLAGS: -D_UNIX64
#cgo pkg-config: python3-embed
#include <stdio.h>
#include <Python.h>
#include "foo.h"
typedef struct {
int a;
} s4;
typedef struct {
int a;
int b;
} s8;
typedef struct {
int a;
int b;
int c;
} s12;
typedef struct {
int a;
int b;
int c;
int d;
} s16;
typedef struct {
int a;
int b;
int c;
int d;
int e;
} s20;
static int test_structs(s4* s4, s8* s8, s12* s12, s16* s16, s20* s20) {
printf("s4.a: %d\n", s4->a);
printf("s8.a: %d, s8.b: %d\n", s8->a, s8->b);
printf("s12.a: %d, s12.b: %d, s12.c: %d\n", s12->a, s12->b, s12->c);
printf("s16.a: %d, s16.b: %d, s16.c: %d, s16.d: %d\n", s16->a, s16->b, s16->c, s16->d);
printf("s20.a: %d, s20.b: %d, s20.c: %d, s20.d: %d, s20.e: %d\n", s20->a, s20->b, s20->c, s20->d, s20->e);
return s4->a + s8->a + s8->b + s12->a + s12->b + s12->c + s16->a + s16->b + s16->c + s16->d + s20->a + s20->b + s20->c + s20->d + s20->e;
}
static void test_macros() {
#ifdef FOO
printf("FOO is defined\n");
#endif
#ifdef BAR
printf("BAR is defined\n");
#endif
#ifdef _WIN32
printf("WIN32 is defined\n");
#endif
#ifdef _POSIX
printf("POSIX is defined\n");
#endif
#ifdef _WIN64
printf("WIN64 is defined\n");
#endif
#ifdef _LINUX64
printf("LINUX64 is defined\n");
#endif
#ifdef _UNIX64
printf("UNIX64 is defined\n");
#endif
}
#define MY_VERSION "1.0.0"
#define MY_CODE 0x12345678
static void test_void() {
printf("test_void\n");
}
typedef int (*Cb)(int);
extern int go_callback(int);
extern int c_callback(int i);
static void test_callback(Cb cb) {
printf("test_callback, cb: %p, go_callback: %p, c_callback: %p\n", cb, go_callback, c_callback);
printf("test_callback, *cb: %p, *go_callback: %p, *c_callback: %p\n", *(void**)cb, *(void**)(go_callback), *(void**)(c_callback));
printf("cb result: %d\n", cb(123));
printf("done\n");
}
extern int go_callback_not_use_in_go(int);
static void run_callback() {
test_callback(c_callback);
test_callback(go_callback_not_use_in_go);
}
*/
import "C"
import (
"fmt"
"unsafe"
"github.com/goplus/llgo/_demo/cgofull/pymod1"
"github.com/goplus/llgo/_demo/cgofull/pymod2"
)
//export go_callback_not_use_in_go
func go_callback_not_use_in_go(i C.int) C.int {
return i + 1
}
//export go_callback
func go_callback(i C.int) C.int {
return i + 1
}
func main() {
runPy()
f := &C.Foo{a: 1}
Foo(f)
Bar(f)
C.test_macros()
r := C.test_structs(&C.s4{a: 1}, &C.s8{a: 1, b: 2}, &C.s12{a: 1, b: 2, c: 3}, &C.s16{a: 1, b: 2, c: 3, d: 4}, &C.s20{a: 1, b: 2, c: 3, d: 4, e: 5})
fmt.Println(r)
if r != 35 {
panic("test_structs failed")
}
fmt.Println(C.MY_VERSION)
fmt.Println(int(C.MY_CODE))
C.test_void()
println("call run_callback")
C.run_callback()
// test _Cgo_ptr and _cgoCheckResult
println("call with go_callback")
C.test_callback((C.Cb)(C.go_callback))
println("call with c_callback")
C.test_callback((C.Cb)(C.c_callback))
}
func runPy() {
Initialize()
defer Finalize()
Run("print('Hello, Python!')")
C.PyObject_Print((*C.PyObject)(unsafe.Pointer(pymod1.Float(1.23))), C.stderr, 0)
C.PyObject_Print((*C.PyObject)(unsafe.Pointer(pymod2.Long(123))), C.stdout, 0)
// test _Cgo_use
C.PyObject_Print((*C.PyObject)(unsafe.Pointer(C.PyComplex_FromDoubles(C.double(1.23), C.double(4.56)))), C.stdout, 0)
}

12
_demo/cgofull/foo.c Normal file
View File

@@ -0,0 +1,12 @@
#include <stdio.h>
#include "foo.h"
void print_foo(Foo *f)
{
printf("print_foo: %d\n", f->a);
}
int c_callback(int i)
{
return i + 1;
}

16
_demo/cgofull/foo.go Normal file
View File

@@ -0,0 +1,16 @@
package main
/*
#cgo CFLAGS: -DFOO
#include <stdio.h>
#include "foo.h"
static void foo(Foo* f) {
printf("foo in bar: %d\n", f->a);
}
*/
import "C"
func Foo(f *C.Foo) {
C.print_foo(f)
C.foo(f)
}

7
_demo/cgofull/foo.h Normal file
View File

@@ -0,0 +1,7 @@
#pragma once
typedef struct {
int a;
} Foo;
extern void print_foo(Foo* f);

24
_demo/cgofull/py.go Normal file
View File

@@ -0,0 +1,24 @@
package main
/*
#cgo pkg-config: python3-embed
#include <Python.h>
*/
import "C"
import "fmt"
func Initialize() {
C.Py_Initialize()
}
func Finalize() {
C.Py_Finalize()
}
func Run(code string) error {
if C.PyRun_SimpleString(C.CString(code)) != 0 {
C.PyErr_Print()
return fmt.Errorf("failed to run code")
}
return nil
}

View File

@@ -0,0 +1,11 @@
package pymod1
/*
#cgo pkg-config: python3-embed
#include <Python.h>
*/
import "C"
func Float(f float64) *C.PyObject {
return C.PyFloat_FromDouble(C.double(f))
}

View File

@@ -0,0 +1,11 @@
package pymod2
/*
#cgo pkg-config: python3-embed
#include <Python.h>
*/
import "C"
func Long(l int64) *C.PyObject {
return C.PyLong_FromLongLong(C.longlong(l))
}

28
_demo/checkfile/demo.go Normal file
View File

@@ -0,0 +1,28 @@
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
tempDir := os.TempDir()
noexist := filepath.Join(tempDir, "noexist.txt")
if _, err := os.Stat(noexist); err != nil {
if os.IsNotExist(err) {
fmt.Println("noexist:", err.Error())
} else {
fmt.Println("exist,other err:", err.Error())
}
}
if _, err := os.Open(noexist); err != nil {
if os.IsNotExist(err) {
fmt.Println("noexist:", err.Error())
} else {
fmt.Println("exist,other err:", err.Error())
}
}
}

View File

@@ -0,0 +1,18 @@
package main
import (
"bytes"
"os/exec"
)
func main() {
var data bytes.Buffer
cmd := exec.Command("echo", "hello llgo")
cmd.Stdout = &data
err := cmd.Run()
if err != nil {
panic(err)
}
println("len:", len(data.Bytes()))
println("data:", data.String())
}

View File

@@ -0,0 +1,42 @@
package main
import (
"fmt"
)
type MyStruct[T any] struct {
value T
}
func (m *MyStruct[T]) Method() {
fmt.Println("In generic method")
genericFunc[T](m.value)
}
func genericFunc[T any](v T) {
fmt.Println("In generic function")
normalFunc()
}
func normalFunc() {
fmt.Println("In normal function")
panic("panic occurs here")
}
func main() {
m := &MyStruct[string]{value: "hello"}
m.Method()
}
//Expected:
// In generic method
// In generic function
// In normal function
// panic: panic occurs here
// [0x00C6D310 github.com/goplus/llgo/internal/runtime.Rethrow+0x2f, SP = 0x60]
// [0x00C6CF44 github.com/goplus/llgo/internal/runtime.Panic+0x2d, SP = 0x50]
// [0x00C69420 main.normalFunc+0xf, SP = 0xa8]
// [0x00C69564 main.genericFunc[string]+0x18, SP = 0x74]
// [0x00C694A8 main.(*MyStruct[string]).Method+0x1f, SP = 0x84]
// [0x00C6936C main+0x4, SP = 0x40]

View File

@@ -0,0 +1,42 @@
package main
import (
"fmt"
"reflect"
)
func add(a, b int) int {
return a + b
}
func main() {
fn := func(a, b int) int {
return a + b
}
var i int
fn1 := func() {
i++
}
fn2 := func() func() {
return func() {
println("closure", i)
}
}
fns := []any{add, fn, fn1, fn2}
for _, fn := range fns {
v := reflect.ValueOf(fn)
fmt.Println(v.Type())
fmt.Println(v.Kind())
if v.Kind() != reflect.Func {
panic(fmt.Sprintf("not func: %T", fn))
}
t := v.Type()
fmt.Println(t)
fmt.Println(t.Kind())
if t.Kind() != reflect.Func {
panic(fmt.Sprintf("not func: %T", fn))
}
}
}

View File

@@ -0,0 +1,31 @@
package main
import (
"io"
"os"
"sync"
"unsafe"
llsync "github.com/goplus/llgo/c/pthread/sync"
)
type L struct {
mu sync.Mutex
s string
i int
w io.Writer
}
func main() {
l := &L{s: "hello", i: 123, w: os.Stdout}
println("sizeof(L):", unsafe.Sizeof(L{}))
println("sizeof(sync.Mutex):", unsafe.Sizeof(sync.Mutex{}))
println("sizeof(llsync.Mutex):", unsafe.Sizeof(llsync.Mutex{}))
println("l:", l, "l.s:", l.s, "l.i:", l.i, "l.w:", l.w)
l.mu.Lock()
println("locked")
println("l:", l, "l.s:", l.s, "l.i:", l.i, "l.w:", l.w)
l.w.Write([]byte(l.s))
l.w.Write([]byte("\n"))
l.mu.Unlock()
}

View File

@@ -38,7 +38,7 @@ func main() {
items := cjson.Array()
mod := py.ImportModule(pyLib)
keys := mod.ModuleGetDict().DictKeys()
for i, n := uintptr(0), keys.ListLen(); i < n; i++ {
for i, n := 0, keys.ListLen(); i < n; i++ {
key := keys.ListItem(i)
val := mod.GetAttr(key)
doc := val.GetAttrString(c.Str("__doc__"))

29
c/c.go
View File

@@ -33,9 +33,13 @@ type (
Float = float32
Double = float64
Pointer = unsafe.Pointer
FilePtr = unsafe.Pointer
FilePtr = *FILE
)
type FILE struct {
Unused [8]byte
}
type (
Int C.int
Uint C.uint
@@ -51,6 +55,23 @@ type integer interface {
~int | ~uint | ~uintptr | ~int32 | ~uint32 | ~int64 | ~uint64
}
type SizeT = uintptr
type IntptrT = uintptr
type UintptrT = uintptr
type Int8T = int8
type Int16T = int16
type Int32T = int32
type Int64T = int64
type Uint8T = uint8
type Uint16T = uint16
type Uint32T = uint32
type Uint64T = uint64
type IntmaxT = LongLong
type UintmaxT = UlongLong
//go:linkname Str llgo.cstr
func Str(string) *Char
@@ -85,6 +106,9 @@ func Calloc(num uintptr, size uintptr) Pointer
//go:linkname Free C.free
func Free(ptr Pointer)
//go:linkname Realloc C.realloc
func Realloc(ptr Pointer, size uintptr) Pointer
//go:linkname Memcpy C.memcpy
func Memcpy(dst, src Pointer, n uintptr) Pointer
@@ -273,3 +297,6 @@ func GetoptLong(argc Int, argv **Char, optstring *Char, longopts *Option, longin
func GetoptLongOnly(argc Int, argv **Char, optstring *Char, longopts *Option, longindex *Int) Int
// -----------------------------------------------------------------------------
//go:linkname Sysconf C.sysconf
func Sysconf(name Int) Long

View File

@@ -0,0 +1,35 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/clang"
"github.com/goplus/llgo/compiler/chore/_xtool/llcppsymg/clangutils"
)
func main() {
_, unit, err := clangutils.CreateTranslationUnit(&clangutils.Config{
File: "#include <stddef.h>",
Temp: true,
IsCpp: false,
})
if err != nil {
println(err.Error())
return
}
clang.GetInclusions(unit, func(included_file clang.File, inclusion_stack *clang.SourceLocation, include_len c.Uint, client_data c.Pointer) {
filename := included_file.FileName()
c.Printf(c.Str("Included file: %s Include length: %d\n"), filename.CStr(), include_len)
inclusions := unsafe.Slice(inclusion_stack, include_len)
for i := range inclusions {
loc := inclusions[i]
var file clang.File
var line, column c.Uint
loc.SpellingLocation(&file, &line, &column, nil)
filename = file.FileName()
c.Printf(c.Str(" included from: %s:%d:%d\n"), filename.CStr(), line, column)
}
}, nil)
}

View File

@@ -15,6 +15,14 @@ CXChildVisitResult wrap_visitor(CXCursor cursor, CXCursor parent, CXClientData d
extern "C" {
void wrap_clang_getLocation(CXTranslationUnit tu, CXFile file, unsigned line, unsigned column, CXSourceLocation *loc) {
*loc = clang_getLocation(tu, file, line, column);
}
void wrap_clang_getLocationForOffset(CXTranslationUnit tu, CXFile file, unsigned offset, CXSourceLocation *loc) {
*loc = clang_getLocationForOffset(tu, file, offset);
}
void wrap_clang_getTranslationUnitCursor(CXTranslationUnit uint, CXCursor *cur) {
*cur = clang_getTranslationUnitCursor(uint);
}
@@ -27,12 +35,20 @@ int wrap_clang_Cursor_isNull(CXCursor *cursor) { return clang_Cursor_isNull(*cur
void wrap_clang_getCursorSemanticParent(CXCursor *C, CXCursor *parent) { *parent = clang_getCursorSemanticParent(*C); }
void wrap_clang_getCursorDefinition(CXCursor *C, CXCursor *def) { *def = clang_getCursorDefinition(*C); }
void wrap_clang_getCursorLexicalParent(CXCursor *C, CXCursor *parent) { *parent = clang_getCursorLexicalParent(*C); }
void wrap_clang_getOverriddenCursors(CXCursor *cursor, CXCursor **overridden, unsigned *num_overridden) {
clang_getOverriddenCursors(*cursor, overridden, num_overridden);
}
CXFile wrap_clang_getIncludedFile(CXCursor *cursor) { return clang_getIncludedFile(*cursor); }
void wrap_clang_getCursor(CXTranslationUnit uint, CXSourceLocation *loc, CXCursor *cur) {
*cur = clang_getCursor(uint, *loc);
}
void wrap_clang_getCursorLocation(CXCursor *cur, CXSourceLocation *loc) { *loc = clang_getCursorLocation(*cur); }
void wrap_clang_getCursorExtent(CXCursor *cur, CXSourceRange *range) { *range = clang_getCursorExtent(*cur); }
@@ -95,6 +111,8 @@ long long wrap_clang_getArraySize(CXType *arrayTyp) { return clang_getArraySize(
void wrap_clang_Type_getNamedType(CXType *typ, CXType *namedTyp) { *namedTyp = clang_Type_getNamedType(*typ); }
long long wrap_clang_Type_getSizeOf(CXType *typ) { return clang_Type_getSizeOf(*typ); }
unsigned wrap_clang_Cursor_isAnonymous(CXCursor *cursor) { return clang_Cursor_isAnonymous(*cursor); }
unsigned wrap_clang_Cursor_isAnonymousRecordDecl(CXCursor *cursor) {
@@ -113,8 +131,18 @@ CXString wrap_clang_getCursorUSR(CXCursor *cur) { return clang_getCursorUSR(*cur
CXString wrap_clang_getCursorSpelling(CXCursor *cur) { return clang_getCursorSpelling(*cur); }
CXString wrap_clang_getCursorDisplayName(CXCursor *cur) { return clang_getCursorDisplayName(*cur); }
void wrap_clang_getCursorReferenced(CXCursor *cur, CXCursor *referenced) {
*referenced = clang_getCursorReferenced(*cur);
}
unsigned wrap_clang_Cursor_isVariadic(CXCursor *cur) { return clang_Cursor_isVariadic(*cur); }
void wrap_clang_Cursor_getCommentRange(CXCursor *cur, CXSourceRange *range) {
*range = clang_Cursor_getCommentRange(*cur);
}
CXString wrap_clang_Cursor_getRawCommentText(CXCursor *cursor) { return clang_Cursor_getRawCommentText(*cursor); }
CXString wrap_clang_Cursor_getMangling(CXCursor *cur) { return clang_Cursor_getMangling(*cur); }
@@ -178,6 +206,8 @@ unsigned wrap_clang_visitChildren(CXCursor *parent, wrap_CXCursorVisitor visitor
return clang_visitChildren(*parent, wrap_visitor, CXClientData(&data));
}
int wrap_clang_Location_isInSystemHeader(CXSourceLocation *loc) { return clang_Location_isInSystemHeader(*loc); }
void wrap_clang_getSpellingLocation(CXSourceLocation *loc, CXFile *file, unsigned *line, unsigned *column,
unsigned *offset) {
clang_getSpellingLocation(*loc, file, line, column, offset);

View File

@@ -57,3 +57,12 @@ type StringSet struct {
*/
// llgo:link (*StringSet).Dispose C.clang_disposeStringSet
func (*StringSet) Dispose() {}
func GoString(clangStr String) (str string) {
defer clangStr.Dispose()
cstr := clangStr.CStr()
if cstr != nil {
str = c.GoString(cstr)
}
return
}

View File

@@ -1157,6 +1157,30 @@ type UnsavedFile struct {
Length c.Ulong
}
/**
* Retrieves the source location associated with a given file/line/column
* in a particular translation unit.
*/
// llgo:link (*TranslationUnit).wrapGetLocation C.wrap_clang_getLocation
func (t *TranslationUnit) wrapGetLocation(file File, line, column c.Uint, loc *SourceLocation) {}
func (t *TranslationUnit) GetLocation(file File, line, column c.Uint) (ret SourceLocation) {
t.wrapGetLocation(file, line, column, &ret)
return
}
/**
* Retrieves the source location associated with a given character offset
* in a particular translation unit.
*/
// llgo:link (*TranslationUnit).wrapGetLocationForOffset C.wrap_clang_getLocationForOffset
func (t *TranslationUnit) wrapGetLocationForOffset(file File, offset c.Uint, loc *SourceLocation) {}
func (t *TranslationUnit) GetLocationForOffset(file File, offset c.Uint) (ret SourceLocation) {
t.wrapGetLocationForOffset(file, offset, &ret)
return
}
/**
* An "index" that consists of a set of translation units that would
* typically be linked together into an executable or library.
@@ -1611,6 +1635,14 @@ func (c Cursor) SemanticParent() (parent Cursor) {
return
}
// llgo:link (*Cursor).wrapDefinition C.wrap_clang_getCursorDefinition
func (*Cursor) wrapDefinition(def *Cursor) {}
func (c Cursor) Definition() (def Cursor) {
c.wrapDefinition(&def)
return
}
/**
* Determine the lexical parent of the given cursor.
*
@@ -1710,6 +1742,43 @@ func (c Cursor) OverriddenCursors(overridden **Cursor, numOverridden *c.Uint) {
// llgo:link (*Cursor).DisposeOverriddenCursors C.clang_disposeOverriddenCursors
func (c *Cursor) DisposeOverriddenCursors() {}
/**
* Retrieve the file that is included by the given inclusion directive
* cursor.
*/
// llgo:link (*Cursor).wrapIncludedFile C.wrap_clang_getIncludedFile
func (c *Cursor) wrapIncludedFile() File {
return 0
}
func (c Cursor) IncludedFile() (file File) {
return c.wrapIncludedFile()
}
/**
* Map a source location to the cursor that describes the entity at that
* location in the source code.
*
* clang_getCursor() maps an arbitrary source location within a translation
* unit down to the most specific cursor that describes the entity at that
* location. For example, given an expression \c x + y, invoking
* clang_getCursor() with a source location pointing to "x" will return the
* cursor for "x"; similarly for "y". If the cursor points anywhere between
* "x" or "y" (e.g., on the + or the whitespace around it), clang_getCursor()
* will return a cursor referring to the "+" expression.
*
* \returns a cursor representing the entity at the given source location, or
* a NULL cursor if no such entity can be found.
*/
// llgo:link (*TranslationUnit).wrapGetCursor C.wrap_clang_getCursor
func (l *TranslationUnit) wrapGetCursor(loc *SourceLocation, cur *Cursor) {}
func (l *TranslationUnit) GetCursor(loc *SourceLocation) (cur Cursor) {
l.wrapGetCursor(loc, &cur)
return
}
/**
* Retrieve the physical location of the source constructor referenced
* by the given cursor.
@@ -2079,6 +2148,61 @@ func (t Type) NamedType() (ret Type) {
return
}
/**
* List the possible error codes for \c clang_Type_getSizeOf,
* \c clang_Type_getAlignOf, \c clang_Type_getOffsetOf and
* \c clang_Cursor_getOffsetOf.
*
* A value of this enumeration type can be returned if the target type is not
* a valid argument to sizeof, alignof or offsetof.
*/
type LayoutError c.Int
const (
/**
* Type is of kind CXType_Invalid.
*/
LayoutErrorInvalid LayoutError = -1
/**
* The type is an incomplete Type.
*/
LayoutErrorIncomplete LayoutError = -2
/**
* The type is a dependent Type.
*/
LayoutErrorDependent LayoutError = -3
/**
* The type is not a constant size type.
*/
LayoutErrorNotConstantSize LayoutError = -4
/**
* The Field name is not valid for this record.
*/
LayoutErrorInvalidFieldName LayoutError = -5
/**
* The type is undeduced.
*/
LayoutErrorUndeduced LayoutError = -6
)
/**
* Return the size of a type in bytes as per C++[expr.sizeof] standard.
*
* If the type declaration is invalid, CXTypeLayoutError_Invalid is returned.
* If the type declaration is an incomplete type, CXTypeLayoutError_Incomplete
* is returned.
* If the type declaration is a dependent type, CXTypeLayoutError_Dependent is
* returned.
*/
// llgo:link (*Type).wrapSizeOf C.wrap_clang_Type_getSizeOf
func (t *Type) wrapSizeOf() (ret c.LongLong) {
return 0
}
func (t Type) SizeOf() (ret c.LongLong) {
return t.wrapSizeOf()
}
/**
* Determine whether the given cursor represents an anonymous
* tag or namespace
@@ -2196,6 +2320,39 @@ func (c Cursor) String() (ret String) {
return c.wrapString()
}
/**
* Retrieve the display name for the entity referenced by this cursor.
*
* The display name contains extra information that helps identify the cursor,
* such as the parameters of a function or template or the arguments of a
* class template specialization.
*/
// llgo:link (*Cursor).wrapDisplayName C.wrap_clang_getCursorDisplayName
func (*Cursor) wrapDisplayName() (ret String) {
return
}
func (c Cursor) DisplayName() (ret String) {
return c.wrapDisplayName()
}
/** For a cursor that is a reference, retrieve a cursor representing the
* entity that it references.
*
* Reference cursors refer to other entities in the AST. For example, an
* Objective-C superclass reference cursor refers to an Objective-C class.
* This function produces the cursor for the Objective-C class from the
* cursor for the superclass reference. If the input cursor is a declaration or
* definition, it returns that declaration or definition unchanged.
* Otherwise, returns the NULL cursor.
*/
// llgo:link (*Cursor).wrapReferenced C.wrap_clang_getCursorReferenced
func (*Cursor) wrapReferenced(referenced *Cursor) {}
func (c Cursor) Referenced() (referenced Cursor) {
c.wrapReferenced(&referenced)
return
}
/**
* Returns non-zero if the given cursor is a variadic function or method.
*/
@@ -2204,6 +2361,19 @@ func (*Cursor) wrapIsVariadic() (ret c.Uint) { return 0 }
func (c Cursor) IsVariadic() (ret c.Uint) { return c.wrapIsVariadic() }
/**
* Given a cursor that represents a declaration, return the associated
* comment's source range. The range may include multiple consecutive comments
* with whitespace in between.
*/
// llgo:link (*Cursor).wrapCommentRange C.wrap_clang_Cursor_getCommentRange
func (c *Cursor) wrapCommentRange(ret *SourceRange) {}
func (c Cursor) CommentRange() (loc SourceRange) {
c.wrapCommentRange(&loc)
return
}
/**
* Given a cursor that represents a declaration, return the associated
* comment text, including comment markers.
@@ -2596,6 +2766,29 @@ func VisitChildren(
//llgo:type C
type Visitor func(cursor, parent Cursor, clientData ClientData) ChildVisitResult
/**
* Visitor invoked for each file in a translation unit
* (used with clang_getInclusions()).
*
* This visitor function will be invoked by clang_getInclusions() for each
* file included (either at the top-level or by \#include directives) within
* a translation unit. The first argument is the file being included, and
* the second and third arguments provide the inclusion stack. The
* array is sorted in order of immediate inclusion. For example,
* the first element refers to the location that included 'included_file'.
*/
//llgo:type C
type InclusionVisitor func(included_file File, inclusion_stack *SourceLocation, include_len c.Uint, client_data ClientData)
/**
* Visit the set of preprocessor inclusions in a translation unit.
* The visitor function is called with the provided data for every included
* file. This does not include headers included by the PCH file (unless one
* is inspecting the inclusions in the PCH file itself).
*/
//go:linkname GetInclusions C.clang_getInclusions
func GetInclusions(tu *TranslationUnit, visitor InclusionVisitor, client_data ClientData)
/**
* Tokenize the source code described by the given range into raw
* lexical tokens.
@@ -2626,6 +2819,16 @@ func (t *TranslationUnit) Tokenize(ran SourceRange, tokens **Token, numTokens *c
// llgo:link (*TranslationUnit).DisposeTokens C.clang_disposeTokens
func (t *TranslationUnit) DisposeTokens(tokens *Token, numTokens c.Uint) {}
/**
* Returns non-zero if the given source location is in a system header.
*/
// llgo:link (*SourceLocation).wrapIsInSystemHeader C.wrap_clang_Location_isInSystemHeader
func (l *SourceLocation) wrapIsInSystemHeader() (ret c.Uint) { return 0 }
func (l SourceLocation) IsInSystemHeader() (ret c.Uint) {
return l.wrapIsInSystemHeader()
}
/**
* Retrieve the file, line, column, and offset represented by
* the given source location.
@@ -2655,6 +2858,26 @@ func (l SourceLocation) SpellingLocation(file *File, line, column, offset *c.Uin
l.wrapSpellingLocation(file, line, column, offset)
}
func (l SourceLocation) File() (ret File) {
l.wrapSpellingLocation(&ret, nil, nil, nil)
return
}
func (l SourceLocation) Line() (ret c.Uint) {
l.wrapSpellingLocation(nil, &ret, nil, nil)
return
}
func (l SourceLocation) Column() (ret c.Uint) {
l.wrapSpellingLocation(nil, nil, &ret, nil)
return
}
func (l SourceLocation) Offset() (ret c.Uint) {
l.wrapSpellingLocation(nil, nil, nil, &ret)
return
}
/**
* Retrieve a source location representing the first character within a
* source range.

View File

@@ -0,0 +1,27 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/debug"
)
type T struct {
n int
}
func (t *T) Demo() {
println(t.n)
addr := debug.Address()
c.Printf(c.Str("addr:0x%x\n"), addr)
var info debug.Info
r := debug.Addrinfo(addr, &info)
if r == 0 {
panic("not found info")
}
c.Printf(c.Str("func file:%s name:%s base:0x%x addr:0x%x\n"), info.Fname, info.Sname, info.Fbase, info.Saddr)
}
func main() {
t := &T{100}
t.Demo()
}

View File

@@ -0,0 +1,26 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c/debug"
)
type T struct {
n int
}
func (t *T) Demo() {
println(t.n)
debug.StackTrace(0, func(fr *debug.Frame) bool {
var info debug.Info
debug.Addrinfo(unsafe.Pointer(fr.PC), &info)
println("[", fr.PC, "]", fr.Name, "+", fr.Offset, ", SP =", fr.SP)
return true
})
}
func main() {
t := &T{100}
t.Demo()
}

39
c/debug/_wrap/debug.c Normal file
View File

@@ -0,0 +1,39 @@
#if defined(__linux__)
#define UNW_LOCAL_ONLY
#define _GNU_SOURCE
#include <features.h>
#endif
#include <dlfcn.h>
#include <libunwind.h>
void *llgo_address() {
return __builtin_return_address(0);
}
int llgo_addrinfo(void *addr, Dl_info *info) {
return dladdr(addr, info);
}
void llgo_stacktrace(int skip, void *ctx, int (*fn)(void *ctx, void *pc, void *offset, void *sp, char *name)) {
unw_cursor_t cursor;
unw_context_t context;
unw_word_t offset, pc, sp;
char fname[256];
unw_getcontext(&context);
unw_init_local(&cursor, &context);
int depth = 0;
while (unw_step(&cursor) > 0) {
if (depth < skip) {
depth++;
continue;
}
if (unw_get_reg(&cursor, UNW_REG_IP, &pc) == 0) {
unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);
unw_get_reg(&cursor, UNW_REG_SP, &sp);
if (fn(ctx, (void*)pc, (void*)offset, (void*)sp, fname) == 0) {
return;
}
}
}
}

49
c/debug/debug.go Normal file
View File

@@ -0,0 +1,49 @@
package debug
/*
#cgo linux LDFLAGS: -lunwind
*/
import "C"
import (
"unsafe"
"github.com/goplus/llgo/c"
)
const (
LLGoPackage = "link"
LLGoFiles = "_wrap/debug.c"
)
type Info struct {
Fname *c.Char
Fbase c.Pointer
Sname *c.Char
Saddr c.Pointer
}
//go:linkname Address C.llgo_address
func Address() unsafe.Pointer
//go:linkname Addrinfo C.llgo_addrinfo
func Addrinfo(addr unsafe.Pointer, info *Info) c.Int
//go:linkname stacktrace C.llgo_stacktrace
func stacktrace(skip c.Int, ctx unsafe.Pointer, fn func(ctx, pc, offset, sp unsafe.Pointer, name *c.Char) c.Int)
type Frame struct {
PC uintptr
Offset uintptr
SP unsafe.Pointer
Name string
}
func StackTrace(skip int, fn func(fr *Frame) bool) {
stacktrace(c.Int(1+skip), unsafe.Pointer(&fn), func(ctx, pc, offset, sp unsafe.Pointer, name *c.Char) c.Int {
fn := *(*func(fr *Frame) bool)(ctx)
if !fn(&Frame{uintptr(pc), uintptr(offset), sp, c.GoString(name)}) {
return 0
}
return 1
})
}

25
c/ffi/_demo/_wrap/wrap.c Normal file
View File

@@ -0,0 +1,25 @@
#include <stdio.h>
struct array
{
int x;
int y;
int z;
int k;
};
int demo1(struct array a)
{
printf("c.demo1: %d %d %d %d\n",a.x,a.y,a.z,a.k);
return a.x+a.y+a.z+a.k;
}
int demo2( int (*fn)(struct array)) {
printf("c.demo2: %p\n",fn);
struct array a;
a.x = 1;
a.y = 2;
a.z = 3;
a.k = 4;
return (*fn)(a);
}

65
c/ffi/_demo/cfunc/main.go Normal file
View File

@@ -0,0 +1,65 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/ffi"
)
const (
LLGoPackage = "link"
LLGoFiles = "../_wrap/wrap.c"
)
//llgo:type C
type Callback func(array) c.Int
//go:linkname demo1 C.demo1
func demo1(array) c.Int
//go:linkname demo2 C.demo2
func demo2(fn Callback) c.Int
//llgo:type C
type array struct {
x c.Int
y c.Int
z c.Int
k c.Int
}
var (
typeInt32 = &ffi.Type{4, 4, ffi.Sint32, nil}
typePointer = &ffi.Type{unsafe.Sizeof(0), uint16(unsafe.Alignof(0)), ffi.Pointer, nil}
)
func main() {
cdemo1()
cdemo2()
}
func cdemo1() {
var cif ffi.Cif
tarray := &ffi.Type{0, 0, ffi.Struct, &[]*ffi.Type{typeInt32, typeInt32, typeInt32, typeInt32, nil}[0]}
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{tarray}[0])
if status != ffi.OK {
panic(status)
}
ar := array{1, 2, 3, 4}
var ret int32
ffi.Call(&cif, c.Func(demo1), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&ar)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}
func cdemo2() {
var cif ffi.Cif
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{typePointer}[0])
if status != ffi.OK {
panic(status)
}
var ret int32
fn := c.Func(demo1)
ffi.Call(&cif, c.Func(demo2), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&fn)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}

View File

@@ -0,0 +1,93 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/ffi"
)
const (
LLGoPackage = "link"
LLGoFiles = "../_wrap/wrap.c"
)
//llgo:type C
type Callback func(array) c.Int
//go:linkname demo1 C.demo1
func demo1(array) c.Int
//go:linkname demo2 C.demo2
func demo2(fn Callback) c.Int
//llgo:type C
type array struct {
x c.Int
y c.Int
z c.Int
k c.Int
}
func demo(a array) c.Int {
c.Printf(c.Str("go.demo %d %d %d %d\n"), a.x, a.y, a.z, a.k)
return a.x + a.y + a.z + a.k
}
var (
typeInt32 = &ffi.Type{4, 4, ffi.Sint32, nil}
typePointer = &ffi.Type{unsafe.Sizeof(0), uint16(unsafe.Alignof(0)), ffi.Pointer, nil}
)
func main() {
gofn()
c.Printf(c.Str("\n"))
goclosure()
}
func gofn() {
var cif ffi.Cif
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{typePointer}[0])
if status != ffi.OK {
panic(status)
}
var fncode unsafe.Pointer
closure := ffi.ClosureAlloc(&fncode)
defer ffi.ClosureFree(closure)
status = ffi.PreClosureLoc(closure, &cif, func(cif *ffi.Cif, ret unsafe.Pointer, args *unsafe.Pointer, userdata unsafe.Pointer) {
ar := *(*array)(ffi.Index(args, 0))
*(*c.Int)(ret) = demo(ar)
}, nil, fncode)
if status != ffi.OK {
panic(status)
}
var ret int32
ffi.Call(&cif, c.Func(demo2), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&fncode)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}
func goclosure() {
var cif ffi.Cif
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{typePointer}[0])
if status != ffi.OK {
panic(status)
}
fn := func(ar array) c.Int {
c.Printf(c.Str("call closure %d\n"), cif.NArgs)
return demo(ar)
}
var fncode unsafe.Pointer
closure := ffi.ClosureAlloc(&fncode)
defer ffi.ClosureFree(closure)
status = ffi.PreClosureLoc(closure, &cif, func(cif *ffi.Cif, ret unsafe.Pointer, args *unsafe.Pointer, userdata unsafe.Pointer) {
ar := *(*array)(ffi.Index(args, 0))
fn := *(*func(array) c.Int)(userdata)
*(*c.Int)(ret) = fn(ar)
}, unsafe.Pointer(&fn), fncode)
if status != ffi.OK {
panic(status)
}
var ret int32
ffi.Call(&cif, c.Func(demo2), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&fncode)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}

View File

@@ -0,0 +1,26 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/ffi"
)
var (
typeInt32 = &ffi.Type{4, 4, ffi.Sint32, nil}
typePointer = &ffi.Type{unsafe.Sizeof(0), uint16(unsafe.Alignof(0)), ffi.Pointer, nil}
)
func main() {
var cif ffi.Cif
status := ffi.PrepCifVar(&cif, ffi.DefaultAbi, 1, 2, typeInt32, &[]*ffi.Type{typePointer, typeInt32}[0])
if status != ffi.OK {
panic(status)
}
var ret int32
text := c.Str("hello world: %d\n")
var n int32 = 100
ffi.Call(&cif, c.Func(c.Printf), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&text), unsafe.Pointer(&n)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}

5
c/ffi/_wrap/libffi.c Normal file
View File

@@ -0,0 +1,5 @@
#include <ffi.h>
void *llog_ffi_closure_alloc(void **code) {
return ffi_closure_alloc(sizeof(ffi_closure), code);
}

7
c/ffi/abi.go Normal file
View File

@@ -0,0 +1,7 @@
//go:build ((freebsd || linux || darwin) && arm64) || (windows && (amd64 || arm64))
package ffi
const (
DefaultAbi = 1
)

7
c/ffi/abi_amd64.go Normal file
View File

@@ -0,0 +1,7 @@
//go:build freebsd || linux || darwin
package ffi
const (
DefaultAbi = 2
)

132
c/ffi/ffi.go Normal file
View File

@@ -0,0 +1,132 @@
package ffi
import (
"unsafe"
"github.com/goplus/llgo/c"
)
const (
LLGoPackage = "link: $(pkg-config --libs libffi); -lffi"
LLGoFiles = "$(pkg-config --cflags libffi): _wrap/libffi.c"
)
const (
Void = iota
Int
Float
Double
LongDouble
Uint8
Sint8
Uint16
Sint16
Uint32
Sint32
Uint64
Sint64
Struct
Pointer
Complex
)
const (
OK = iota
BAD_TYPEDEF
BAD_ABI
BAD_ARGTYPE
)
type Type struct {
Size uintptr
Alignment uint16
Type uint16
Elements **Type
}
/*typedef struct {
ffi_abi abi;
unsigned nargs;
ffi_type **arg_types;
ffi_type *rtype;
unsigned bytes;
unsigned flags;
#ifdef FFI_EXTRA_CIF_FIELDS
FFI_EXTRA_CIF_FIELDS;
#endif
} ffi_cif;
*/
type Cif struct {
Abi c.Uint
NArgs c.Uint
ArgTypes **Type
RType *Type
Bytes c.Uint
Flags c.Uint
//Extra c.Uint
}
/*
ffi_status
ffi_prep_cif(ffi_cif *cif,
ffi_abi abi,
unsigned int nargs,
ffi_type *rtype,
ffi_type **atypes);
*/
//go:linkname PrepCif C.ffi_prep_cif
func PrepCif(cif *Cif, abi c.Uint, nargs c.Uint, rtype *Type, atype **Type) c.Uint
/*
ffi_status ffi_prep_cif_var(ffi_cif *cif,
ffi_abi abi,
unsigned int nfixedargs,
unsigned int ntotalargs,
ffi_type *rtype,
ffi_type **atypes);
*/
//go:linkname PrepCifVar C.ffi_prep_cif_var
func PrepCifVar(cif *Cif, abi c.Uint, nfixedargs c.Uint, ntotalargs c.Uint, rtype *Type, atype **Type) c.Uint
/*
void ffi_call(ffi_cif *cif,
void (*fn)(void),
void *rvalue,
void **avalue);
*/
//go:linkname Call C.ffi_call
func Call(cif *Cif, fn unsafe.Pointer, rvalue unsafe.Pointer, avalue *unsafe.Pointer)
// void *ffi_closure_alloc (size_t size, void **code);
//
//go:linkname ClosureAlloc C.llog_ffi_closure_alloc
func ClosureAlloc(code *unsafe.Pointer) unsafe.Pointer
// void ffi_closure_free (void *);
//
//go:linkname ClosureFree C.ffi_closure_free
func ClosureFree(unsafe.Pointer)
/*
ffi_status
ffi_prep_closure_loc (ffi_closure*,
ffi_cif *,
void (*fun)(ffi_cif*,void*,void**,void*),
void *user_data,
void *codeloc);
*/
//llgo:type C
type ClosureFunc func(cif *Cif, ret unsafe.Pointer, args *unsafe.Pointer, userdata unsafe.Pointer)
//go:linkname PreClosureLoc C.ffi_prep_closure_loc
func PreClosureLoc(closure unsafe.Pointer, cif *Cif, fn ClosureFunc, userdata unsafe.Pointer, codeloc unsafe.Pointer) c.Uint
func add(ptr unsafe.Pointer, offset uintptr) unsafe.Pointer {
return unsafe.Pointer(uintptr(ptr) + offset)
}
func Index(args *unsafe.Pointer, i uintptr) unsafe.Pointer {
return (*(*unsafe.Pointer)(add(unsafe.Pointer(args), i*unsafe.Sizeof(0))))
}

View File

@@ -213,6 +213,16 @@ func LoopNew() *Loop {
return nil
}
// llgo:link (*Loop).SetData C.uv_loop_set_data
func (loop *Loop) SetData(data c.Pointer) {
return
}
// llgo:link (*Loop).GetData C.uv_loop_get_data
func (loop *Loop) GetData() c.Pointer {
return nil
}
// llgo:link (*Loop).Now C.uv_now
func (loop *Loop) Now() c.UlongLong {
return 0

View File

@@ -265,6 +265,11 @@ func (req *Req) GetType() ReqType {
return 0
}
// llgo:link (*Req).Cancel C.uv_cancel
func (req *Req) Cancel() c.Int {
return 0
}
// ----------------------------------------------
/* Stream related function and method */

78
c/libuv/thread.go Normal file
View File

@@ -0,0 +1,78 @@
package libuv
import (
_ "unsafe"
"github.com/goplus/llgo/c"
)
type Thread struct {
Unused [8]byte
}
type ThreadOptions struct {
flags c.Uint
stackSize uintptr
}
type Work struct {
Unused [128]byte
}
// ----------------------------------------------
/* Function type */
// llgo:type C
type ThreadCb func(arg c.Pointer)
//llgo:type C
type WorkCb func(req *Work)
//llgo:type C
type AfterWorkCb func(req *Work, status c.Int)
// ----------------------------------------------
/* Thread related functions and method. */
//go:linkname ThreadEqual C.uv_thread_equal
func ThreadEqual(t1 *Thread, t2 *Thread) c.Int
//go:linkname ThreadGetCPU C.uv_thread_getcpu
func ThreadGetCPU() c.Int
//go:linkname ThreadSelf C.uv_thread_self
func ThreadSelf() Thread
// llgo:link (*Thread).Create C.uv_thread_create
func (t *Thread) Create(entry ThreadCb, arg c.Pointer) c.Int {
return 0
}
// llgo:link (*Thread).CreateEx C.uv_thread_create_ex
func (t *Thread) CreateEx(entry ThreadCb, params *ThreadOptions, arg c.Pointer) c.Int {
return 0
}
// llgo:link (*Thread).Join C.uv_thread_join
func (t *Thread) Join() c.Int {
return 0
}
// llgo:link (*Thread).SetAffinity C.uv_thread_set_affinity
func (t *Thread) SetAffinity(cpuMask *c.Char, oldMask *c.Char, maskSize uintptr) c.Int {
return 0
}
// llgo:link (*Thread).GetAffinity C.uv_thread_get_affinity
func (t *Thread) GetAffinity(cpuMask *c.Char, maskSize uintptr) c.Int {
return 0
}
// ----------------------------------------------
/* Work related functions and method. */
//go:linkname QueueWork C.uv_queue_work
func QueueWork(loop *Loop, req *Work, workCb WorkCb, afterWorkCb AfterWorkCb) c.Int

View File

@@ -13,7 +13,7 @@ func coroutineFunc(L *lua.State) c.Int {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -18,7 +18,7 @@ func coroutineFunc(L *lua.State) {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -29,7 +29,7 @@ func createCountdown(L *lua.State) c.Int {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
L.Openlibs()
defer L.Close()
L.Register(c.Str("create_countdown"), createCountdown)

View File

@@ -24,7 +24,7 @@ func customPanic(L *lua.State) c.Int {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -0,0 +1,48 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func Hook(L *lua.State, ar *lua.Debug) {
L.Getinfo(c.Str("nSl"), ar)
c.Printf(c.Str("Hook called:"))
if name := ar.Name; name != nil {
c.Printf(c.Str("name: %s,"), name)
}
if what := ar.What; what != nil {
c.Printf(c.Str("what: %s,"), what)
}
c.Printf(c.Str("source: %s,"), c.Pointer(unsafe.SliceData(ar.ShortSrc[:])))
c.Printf(c.Str("line: %d\n"), ar.Currentline)
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
L.Sethook(Hook, lua.MASKLINE, 0)
code :=
`function hello(name)
print('Hello, ' .. name .. '!')
end
hello('llgo')`
if res := L.Dostring(c.Str(code)); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.Tostring(-1))
}
}
/* Expected output:
Hook called:what: main,source: [string "function hello(name) ..."],line: 3
Hook called:what: main,source: [string "function hello(name) ..."],line: 1
Hook called:what: main,source: [string "function hello(name) ..."],line: 4
Hook called:name: hello,what: Lua,source: [string "function hello(name) ..."],line: 2
Hello, llgo!
Hook called:name: hello,what: Lua,source: [string "function hello(name) ..."],line: 3
*/

View File

@@ -33,7 +33,7 @@ func reader(L *lua.State, data c.Pointer, size *c.Ulong) *c.Char {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -21,7 +21,7 @@ func writer(L *lua.State, p c.Pointer, sz c.Ulong, ud c.Pointer) c.Int {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
if res := L.Loadstring(c.Str("function doubleNumber(x) ! return x * 2 end")); res != lua.OK {

View File

@@ -0,0 +1,42 @@
package main
import (
"unsafe"
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func GetData(L *lua.State) c.Int {
extra := (*int)(L.Getextraspace())
L.Pushfstring(c.Str("Stored integer is: %d"), *extra)
return 1
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
extra := (*int)(L.Getextraspace())
*extra = 42
difference := uintptr(unsafe.Pointer(L)) - uintptr(L.Getextraspace())
if difference == unsafe.Sizeof(uintptr(0)) {
c.Printf(c.Str("Extra space is pointer size\n"), unsafe.Sizeof(uintptr(0)))
}
L.Pushcfunction(GetData)
L.Setglobal(c.Str("GetData"))
if L.Dostring(c.Str("print(GetData())")) != lua.OK {
c.Printf(c.Str("Error: %s\n"), L.Tostring(-1))
}
}
/* Expected output:
Extra space is pointer size
Stored integer is: 42
*/

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
if res := L.Dostring(c.Str("print('hello world')")); res != lua.OK {

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -29,7 +29,7 @@ func printStack(L *lua.State, message string) {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -17,7 +17,7 @@ func printStack(L *lua.State, stateName *c.Char) {
func main() {
// Create a new Lua state and open libraries
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
@@ -68,7 +68,7 @@ func main() {
printStack(L, c.Str("L1"))
// Create a second Lua state
L1 := lua.Newstate()
L1 := lua.Newstate__1()
defer L1.Close()
// Move two elements to the new state

View File

@@ -0,0 +1,36 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func alloc(ud c.Pointer, ptr c.Pointer, osize c.Ulong, nsize c.Ulong) c.Pointer {
if nsize == 0 {
c.Free(ptr)
return nil
} else {
return c.Realloc(ptr, uintptr(nsize))
}
}
func main() {
L := lua.Newstate__0(alloc, nil)
defer L.Close()
L.Openlibs()
if res := L.Dostring(c.Str("print('new state success')")); res != lua.OK {
println("newstate error")
}
allocf := L.Getallocf(nil)
L.Setallocf(allocf, nil)
if res := L.Dostring(c.Str("print('set newstate success')")); res != lua.OK {
println("set newstate error")
}
}
/* Expected output:
new state success
set newstate success
*/

View File

@@ -1,6 +1,8 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
@@ -8,53 +10,91 @@ import (
func printTable(L *lua.State) {
L.Pushnil()
for L.Next(-2) != 0 {
key := L.Tostring(-2)
value := L.Tostring(-1)
c.Printf(c.Str("%s - %s\n"), key, value)
switch L.Type(-2) {
case lua.STRING:
key := L.Tostring(-2)
c.Printf(c.Str("%s - %s\n"), key, value)
case lua.NUMBER:
key := L.Tonumber(-2)
c.Printf(c.Str("[%.0f] - %s\n"), key, value)
case lua.LIGHTUSERDATA:
c.Printf(c.Str("[pointer] - %s\n"), value)
default:
c.Printf(c.Str("unknown key type %s %d\n"), L.Typename(-2), L.Type(-2))
}
L.Pop(1)
}
L.Pop(1)
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
L.Newtable()
// set table name:John
L.Pushstring(c.Str("name"))
L.Pushstring(c.Str("John"))
L.Settable(-3)
// set table age:30
L.Pushstring(c.Str("age"))
L.Pushnumber(30)
L.Settable(-3)
// set table field fullname:John Doe
L.Pushstring(c.Str("John Doe"))
L.Setfield(-2, c.Str("fullname"))
// set index field
L.Pushinteger(123)
L.Seti(-2, c.Int(1))
// set pointer key field
pointerKey := c.AllocaCStr("pointer key")
L.Pushstring(c.Str("pointer value"))
L.Rawsetp(-2, unsafe.Pointer(pointerKey))
// get field by Getfield
L.Getfield(-1, c.Str("name"))
c.Printf(c.Str("%s\n"), L.Tostring(-1))
c.Printf(c.Str("name: %s\n"), L.Tostring(-1))
L.Pop(1)
// get field by Rawget
L.Pushstring(c.Str("fullname"))
L.Rawget(-2)
c.Printf(c.Str("fullname: %s\n"), L.Tostring(-1))
L.Pop(1)
// get field by Gettable
L.Pushstring(c.Str("age"))
L.Gettable(-2)
age := int(L.Tonumber(-1))
c.Printf(c.Str("Age: %d\n"), age)
L.Pop(1)
// get index field
L.Geti(-1, c.Int(1))
c.Printf(c.Str("Index[%d] value: %d\n"), 1, L.Tointeger(-1))
L.Pop(1)
c.Printf(c.Str("All entries in the table:\n"))
printTable(L)
}
/* Expected output:
John
name: John
fullname: John Doe
Age: 30
Index[1] value: 123
All entries in the table:
age - 30.0
fullname - John Doe
[1] - 123
name - John
[pointer] - pointer value
fullname - John Doe
age - 30.0
*/

View File

@@ -15,7 +15,7 @@ func pushThread(state *lua.State, name string) {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -12,7 +12,7 @@ type lightdata struct {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -33,8 +33,8 @@ func (L *State) Loadfile(filename *c.Char) c.Int { return L.Loadfilex(filename,
// llgo:link (*State).Loadstring C.luaL_loadstring
func (L *State) Loadstring(s *c.Char) c.Int { return 0 }
//go:linkname Newstate C.luaL_newstate
func Newstate() *State
//go:linkname Newstate__1 C.luaL_newstate
func Newstate__1() *State
// /*
// ** ===============================================================

View File

@@ -10,18 +10,18 @@ const (
LLGoPackage = "link: $(pkg-config --libs lua); -llua -lm"
)
// /* mark for precompiled code ('<esc>Lua') */
/* mark for precompiled code ('<esc>Lua') */
// /* option for multiple returns in 'lua_pcall' and 'lua_call' */
/* option for multiple returns in 'lua_pcall' and 'lua_call' */
const (
MULTRET = -1
)
// /*
// ** Pseudo-indices
// ** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty
// ** space after that to help overflow detection)
// */
/*
* Pseudo-indices
* (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty
* space after that to help overflow detection)
*/
const (
REGISTRYINDEX = -MAXSTACK - 1000
@@ -31,7 +31,7 @@ func Upvalueindex(i c.Int) c.Int {
return c.Int(REGISTRYINDEX) - i
}
// /* thread status */
/* thread status */
const (
OK = 0
YIELD = 1
@@ -45,9 +45,9 @@ type State struct {
Unused [8]byte
}
// /*
// ** basic types
// */
/*
* basic types
*/
const (
NONE c.Int = -1
NIL c.Int = 0
@@ -59,50 +59,50 @@ const (
FUNCTION c.Int = 6
USERDATA c.Int = 7
THREAD c.Int = 8
UMTYPES c.Int = 9
NUMTYPES c.Int = 9
)
// /* minimum Lua stack available to a C function */
/* minimum Lua stack available to a C function */
const (
MINSTACK = 20
)
// /* predefined values in the registry */
/* predefined values in the registry */
const (
RIDX_MAINTHREAD = 1
RIDX_GLOBALS = 2
RIDX_LAST = RIDX_GLOBALS
)
// /* type of numbers in Lua */
/* type of numbers in Lua */
type Number = c.Double
// /* type for integer functions */
/* type for integer functions */
type Integer = c.Int
// /* unsigned integer type */
/* unsigned integer type */
type Unsigned = c.Uint
// /* type for continuation-function contexts */
/* type for continuation-function contexts */
type KContext = c.Pointer
// /*
// ** Type for C functions registered with Lua
// */
/*
* Type for C functions registered with Lua
*/
// llgo:type C
type CFunction func(L *State) c.Int
// /*
// ** Type for continuation functions
// */
/*
* Type for continuation functions
*/
// llgo:type C
type KFunction func(L *State, status c.Int, ctx KContext) c.Int
// /*
// ** Type for functions that read/write blocks when loading/dumping Lua chunks
// */
/*
* Type for functions that read/write blocks when loading/dumping Lua chunks
*/
// llgo:type C
type Reader func(L *State, ud c.Pointer, sz *c.Ulong) *c.Char
@@ -110,51 +110,42 @@ type Reader func(L *State, ud c.Pointer, sz *c.Ulong) *c.Char
// llgo:type C
type Writer func(L *State, p c.Pointer, sz c.Ulong, ud c.Pointer) c.Int
// /*
// ** Type for memory-allocation functions
// */
/*
* Type for memory-allocation functions
*/
// typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
// llgo:type C
type Alloc func(ud c.Pointer, ptr c.Pointer, osize c.Ulong, nsize c.Ulong) c.Pointer
// /*
// ** Type for warning functions
// */
/*
* Type for warning functions
*/
// typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);
// llgo:type C
type WarnFunction func(ud c.Pointer, msg c.Char, tocont c.Int)
// /*
// ** Type used by the debug API to collect debug information
// */
/*
* Functions to be called by the debugger in specific events
*/
// typedef struct lua_Debug lua_Debug;
// llgo:type C
type Hook func(L *State, ar *Debug)
// /*
// ** Functions to be called by the debugger in specific events
// */
// typedef void (*lua_Hook) (State *L, lua_Debug *ar);
// /*
// ** generic extra include file
// */
// #if defined(LUA_USER_H)
// #include LUA_USER_H
// #endif
// /*
// ** RCS ident string
// */
/*
* RCS ident string
*/
// extern const char lua_ident[];
// /*
// ** state manipulation
// */
/*
** state manipulation
*/
// llgo:link (*State).Close C.lua_close
func (L *State) Close() {}
// State *(lua_newstate) (lua_Alloc f, void *ud);
// llgo:link Newstate__0 C.lua_newstate
func Newstate__0(f Alloc, ud c.Pointer) *State { return nil }
// llgo:link (*State).Newthread C.lua_newthread
func (L *State) Newthread() *State { return nil }
@@ -171,9 +162,9 @@ func (L *State) Atpanic(panicf CFunction) CFunction { return nil }
// llgo:link (*State).Version C.lua_version
func (L *State) Version() Number { return 0 }
// /*
// ** basic stack manipulation
// */
/*
* basic stack manipulation
*/
// llgo:link (*State).Absindex C.lua_absindex
func (L *State) Absindex(idx c.Int) c.Int { return 0 }
@@ -199,9 +190,9 @@ func (L *State) Checkstack(n c.Int) c.Int { return 0 }
// llgo:link (*State).Xmove C.lua_xmove
func (L *State) Xmove(to *State, n c.Int) {}
// /*
// ** access functions (stack -> C)
// */
/*
* access functions (stack -> C)
*/
// llgo:link (*State).Isnumber C.lua_isnumber
func (L *State) Isnumber(idx c.Int) c.Int { return 0 }
@@ -247,15 +238,17 @@ func (L *State) Touserdata(idx c.Int) c.Pointer { return nil }
// llgo:link (*State).Tothread C.lua_tothread
func (L *State) Tothread(idx c.Int) *State { return nil }
// LUA_API const void *(lua_topointer) (State *L, int idx);
// llgo:link (*State).Topointer C.lua_topointer
func (L *State) Topointer(idx c.Int) c.Pointer { return nil }
// /*
// ** Comparison and arithmetic functions
// */
/*
* Comparison and arithmetic functions
*/
/*
* push functions (C -> stack)
*/
// /*
// ** push functions (C -> stack)
// */
// llgo:link (*State).Pushnil C.lua_pushnil
func (L *State) Pushnil() {}
@@ -286,9 +279,9 @@ func (L *State) Pushlightuserdata(p c.Pointer) {}
// llgo:link (*State).Pushthread C.lua_pushthread
func (L *State) Pushthread() c.Int { return 0 }
// /*
// ** get functions (Lua -> stack)
// */
/*
* get functions (Lua -> stack)
*/
// llgo:link (*State).Getglobal C.lua_getglobal
func (L *State) Getglobal(name *c.Char) c.Int { return 0 }
@@ -299,10 +292,17 @@ func (L *State) Gettable(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Getfield C.lua_getfield
func (L *State) Getfield(idx c.Int, k *c.Char) c.Int { return 0 }
// LUA_API int (lua_geti) (State *L, int idx, lua_Integer n);
// LUA_API int (lua_rawget) (State *L, int idx);
// LUA_API int (lua_rawgeti) (State *L, int idx, lua_Integer n);
// LUA_API int (lua_rawgetp) (State *L, int idx, const void *p);
// llgo:link (*State).Geti C.lua_geti
func (L *State) Geti(idx c.Int, n Integer) c.Int { return 0 }
// llgo:link (*State).Rawget C.lua_rawget
func (L *State) Rawget(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Rawgeti C.lua_rawgeti
func (L *State) Rawgeti(idx c.Int, n Integer) c.Int { return 0 }
// llgo:link (*State).Rawgetp C.lua_rawgetp
func (L *State) Rawgetp(idx c.Int, p c.Pointer) c.Int { return 0 }
// llgo:link (*State).Createtable C.lua_createtable
func (L *State) Createtable(narr c.Int, nrec c.Int) {}
@@ -313,11 +313,12 @@ func (L *State) Newuserdatauv(sz uintptr, nuvalue c.Int) c.Pointer { return nil
// llgo:link (*State).Getmetatable C.lua_getmetatable
func (L *State) Getmetatable(objindex c.Int) c.Int { return 0 }
// LUA_API int (lua_getiuservalue) (State *L, int idx, int n);
// llgo:link (*State).Getiuservalue C.lua_getiuservalue
func (L *State) Getiuservalue(idx c.Int, n c.Int) c.Int { return 0 }
// /*
// ** set functions (stack -> Lua)
// */
/*
* set functions (stack -> Lua)
*/
// llgo:link (*State).Setglobal C.lua_setglobal
func (L *State) Setglobal(name *c.Char) {}
@@ -328,19 +329,27 @@ func (L *State) Settable(idx c.Int) {}
// llgo:link (*State).Setfield C.lua_setfield
func (L *State) Setfield(idx c.Int, k *c.Char) {}
//void (lua_seti) (State *L, int idx, lua_Integer n);
//void (lua_rawset) (State *L, int idx);
//void (lua_rawseti) (State *L, int idx, lua_Integer n);
//void (lua_rawsetp) (State *L, int idx, const void *p);
// llgo:link (*State).Seti C.lua_seti
func (L *State) Seti(idx c.Int, n Integer) {}
// llgo:link (*State).Rawset C.lua_rawset
func (L *State) Rawset(idx c.Int) {}
// llgo:link (*State).Rawseti C.lua_rawseti
func (L *State) Rawseti(idx c.Int, n Integer) {}
// llgo:link (*State).Rawsetp C.lua_rawsetp
func (L *State) Rawsetp(idx c.Int, p c.Pointer) {}
// llgo:link (*State).Setmetatable C.lua_setmetatable
func (L *State) Setmetatable(objindex c.Int) c.Int { return 0 }
//int (lua_setiuservalue) (State *L, int idx, int n);
// llgo:link (*State).Setiuservalue C.lua_setiuservalue
func (L *State) Setiuservalue(idx c.Int, n c.Int) c.Int { return 0 }
// /*
// ** 'load' and 'call' functions (load and run Lua code)
// */
/*
* 'load' and 'call' functions (load and run Lua code)
*/
// llgo:link (*State).Callk C.lua_callk
func (L *State) Callk(nargs c.Int, nresults c.Int, ctx KContext, k KFunction) c.Int {
@@ -366,9 +375,9 @@ func (L *State) Load(reader Reader, dt c.Pointer, chunkname *c.Char, mode *c.Cha
// llgo:link (*State).Dump C.lua_dump
func (L *State) Dump(writer Writer, data c.Pointer, strip c.Int) c.Int { return 0 }
// /*
// ** coroutine functions
// */
/*
* coroutine functions
*/
// llgo:link (*State).Resume C.lua_resume
func (L *State) Resume(from *State, narg c.Int, nres *c.Int) c.Int { return 0 }
@@ -383,16 +392,19 @@ func (L *State) Isyieldable() c.Int { return 0 }
func (L *State) Yieldk(nresults c.Int, ctx KContext, k KFunction) c.Int { return 0 }
func (L *State) Yield(nresults c.Int) c.Int { return L.Yieldk(nresults, nil, nil) }
// /*
// ** Warning-related functions
// */
/*
* Warning-related functions
*/
//void (lua_setwarnf) (State *L, lua_WarnFunction f, void *ud);
//void (lua_warning) (State *L, const char *msg, int tocont);
// llgo:link (*State).Setwarnf C.lua_setwarnf
func (L *State) Setwarnf(f WarnFunction, ud c.Pointer) {}
// /*
// ** garbage-collection function and options
// */
// llgo:link (*State).Warning C.lua_warning
func (L *State) Warning(msg *c.Char, tocont c.Int) {}
/*
* garbage-collection function and options
*/
const (
GCSTOP = 0
@@ -408,36 +420,49 @@ const (
GCINC = 11
)
// LUA_API int (lua_gc) (State *L, int what, ...);
// llgo:link (*State).Gc C.lua_gc
func (L *State) Gc(what c.Int, __llgo_va_list ...any) c.Int { return 0 }
/*
* miscellaneous functions
*/
// /*
// ** miscellaneous functions
// */
// llgo:link (*State).Next C.lua_next
func (L *State) Next(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Error C.lua_error
func (L *State) Error() c.Int { return 0 }
// LUA_API void (lua_concat) (State *L, int n);
// LUA_API void (lua_len) (State *L, int idx);
// llgo:link (*State).Concat C.lua_concat
func (L *State) Concat(n c.Int) {}
// LUA_API size_t (lua_stringtonumber) (State *L, const char *s);
// llgo:link (*State).Len C.lua_len
func (L *State) Len(idx c.Int) {}
// LUA_API lua_Alloc (lua_getallocf) (State *L, void **ud);
// LUA_API void (lua_setallocf) (State *L, lua_Alloc f, void *ud);
// llgo:link (*State).Stringtonumber C.lua_stringtonumber
func (L *State) Stringtonumber(s *c.Char) c.Ulong { return 0 }
// LUA_API void (lua_toclose) (State *L, int idx);
// LUA_API void (lua_closeslot) (State *L, int idx);
// llgo:link (*State).Getallocf C.lua_getallocf
func (L *State) Getallocf(ud *c.Pointer) Alloc { return nil }
// /*
// ** {==============================================================
// ** some useful macros
// ** ===============================================================
// */
// llgo:link (*State).Setallocf C.lua_setallocf
func (L *State) Setallocf(f Alloc, ud c.Pointer) Alloc { return nil }
// #define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE))
// llgo:link (*State).Toclose C.lua_toclose
func (L *State) Toclose(idx c.Int) {}
// llgo:link (*State).Closeslot C.lua_closeslot
func (L *State) Closeslot(idx c.Int) {}
/*
** {==============================================================
** some useful macros
** ===============================================================
*/
func (L *State) Getextraspace() c.Pointer {
return c.Pointer(uintptr(c.Pointer(L)) - EXTRASPACE)
}
func (L *State) Tonumber(idx c.Int) Number { return L.Tonumberx(idx, nil) }
func (L *State) Tostring(idx c.Int) *c.Char { return L.Tolstring(idx, nil) }
func (L *State) Tointeger(idx c.Int) Integer { return L.Tointegerx(idx, nil) }
@@ -458,9 +483,13 @@ func (L *State) Isboolean(n c.Int) bool { return L.Type(n) == c.Int(BOOLEA
func (L *State) Isthread(n c.Int) bool { return L.Type(n) == c.Int(THREAD) }
func (L *State) Isnone(n c.Int) bool { return L.Type(n) == c.Int(NONE) }
func (L *State) Isnoneornil(n c.Int) bool { return L.Type(n) <= 0 }
func (L *State) Pushliteral(s *c.Char) *c.Char {
return L.Pushstring(s)
}
// #define lua_pushliteral(L, s) lua_pushstring(L, "" s)
// #define lua_pushglobaltable(L) ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS))
func (L *State) Pushglobaltable() c.Int {
return L.Rawgeti(REGISTRYINDEX, RIDX_GLOBALS)
}
func (L *State) Insert(idx c.Int) {
L.Rotate(idx, 1)
@@ -476,33 +505,41 @@ func (L *State) Replace(idx c.Int) {
L.Pop(1)
}
// /* }============================================================== */
/* }============================================================== */
// /*
// ** {==============================================================
// ** compatibility macros
// ** ===============================================================
// */
/*
** {==============================================================
** compatibility macros
** ===============================================================
*/
func (L *State) Newuserdata(sz uintptr) c.Pointer {
return L.Newuserdatauv(sz, 1)
}
// #define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1)
// #define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1)
func (L *State) Getuservalue(idx c.Int) c.Int {
return L.Getiuservalue(idx, 1)
}
// #define LUA_NUMTAGS LUA_NUMTYPES
func (L *State) Setuservalue(idx c.Int) c.Int {
return L.Setiuservalue(idx, 1)
}
// /* }============================================================== */
const (
NUMTAGS = NUMTYPES
)
// /*
// ** {======================================================================
// ** Debug API
// ** =======================================================================
// */
// /*
// ** Event codes
// */
/* }============================================================== */
/*
** {======================================================================
** Debug API
** =======================================================================
*/
/*
* Event codes
*/
const (
HOOKCALL = 0
@@ -512,9 +549,9 @@ const (
HOOKTAILCALL = 4
)
// /*
// ** Event masks
// */
/*
* Event masks
*/
const (
MASKCALL = 1 << HOOKCOUNT
@@ -523,22 +560,68 @@ const (
MASKCOUNT = 1 << HOOKCOUNT
)
// LUA_API int (lua_getstack) (State *L, int level, lua_Debug *ar);
// LUA_API int (lua_getinfo) (State *L, const char *what, lua_Debug *ar);
// LUA_API const char *(lua_getlocal) (State *L, const lua_Debug *ar, int n);
// LUA_API const char *(lua_setlocal) (State *L, const lua_Debug *ar, int n);
// LUA_API const char *(lua_getupvalue) (State *L, int funcindex, int n);
// LUA_API const char *(lua_setupvalue) (State *L, int funcindex, int n);
// llgo:link (*State).Getstack C.lua_getstack
func (L *State) Getstack(level c.Int, ar *Debug) c.Int { return 0 }
// LUA_API void *(lua_upvalueid) (State *L, int fidx, int n);
// LUA_API void (lua_upvaluejoin) (State *L, int fidx1, int n1, int fidx2, int n2);
// llgo:link (*State).Getinfo C.lua_getinfo
func (L *State) Getinfo(what *c.Char, ar *Debug) c.Int { return 0 }
// LUA_API void (lua_sethook) (State *L, lua_Hook func, int mask, int count);
// LUA_API lua_Hook (lua_gethook) (State *L);
// LUA_API int (lua_gethookmask) (State *L);
// LUA_API int (lua_gethookcount) (State *L);
// llgo:link (*State).Getlocal C.lua_getlocal
func (L *State) Getlocal(ar *Debug, n c.Int) *c.Char { return nil }
// LUA_API int (lua_setcstacklimit) (State *L, unsigned int limit);
// llgo:link (*State).Setlocal C.lua_setlocal
func (L *State) Setlocal(ar *Debug, n c.Int) *c.Char { return nil }
// struct lua_Debug
// /* }====================================================================== */
// llgo:link (*State).Getupvalue C.lua_getupvalue
func (L *State) Getupvalue(funcindex c.Int, n c.Int) *c.Char { return nil }
// llgo:link (*State).Setupvalue C.lua_setupvalue
func (L *State) Setupvalue(funcindex c.Int, n c.Int) *c.Char { return nil }
// llgo:link (*State).Upvalueid C.lua_upvalueid
func (L *State) Upvalueid(fidx c.Int, n c.Int) c.Pointer { return nil }
// llgo:link (*State).Upvaluejoin C.lua_upvaluejoin
func (L *State) Upvaluejoin(fidx1 c.Int, n1 c.Int, fidx2 c.Int, n2 c.Int) {}
// llgo:link (*State).Sethook C.lua_sethook
func (L *State) Sethook(fn Hook, mask c.Int, count c.Int) {}
// llgo:link (*State).Gethook C.lua_gethook
func (L *State) Gethook() Hook { return nil }
// llgo:link (*State).Gethookmask C.lua_gethookmask
func (L *State) Gethookmask() c.Int { return 0 }
// llgo:link (*State).Gethookcount C.lua_gethookcount
func (L *State) Gethookcount() c.Int { return 0 }
// llgo:link (*State).Setcstacklimit C.lua_setcstacklimit
func (L *State) Setcstacklimit(limit c.Uint) c.Int { return 0 }
type CallInfo struct {
Unused [8]byte
}
type Debug struct {
Event c.Int
Name *c.Char /* (n) */
Namewhat *c.Char /* (n) 'global', 'local', 'field', 'method' */
What *c.Char /* (S) 'Lua', 'C', 'main', 'tail' */
Source *c.Char /* (S) */
Srclen uintptr /* (S) */
Currentline c.Int /* (l) */
Linedefined c.Int /* (S) */
Lastlinedefined c.Int /* (S) */
Nups byte /* (u) number of upvalues */
Nparams byte /* (u) number of parameters */
Isvararg c.Char /* (u) */
Istailcall c.Char /* (t) */
Ftransfer uint16 /* (r) index of first value transferred */
Ntransfer uint16 /* (r) number of transferred values */
ShortSrc [IDSIZE]c.Char /* (S) */
/* private part */
ICi *CallInfo
}
/* }====================================================================== */

View File

@@ -1,5 +1,7 @@
package lua
import "unsafe"
/*
** {==================================================================
** Macros that affect the API and must be stable (that is, must be the
@@ -19,3 +21,21 @@ package lua
const (
MAXSTACK = 1000000
)
/*
@@ LUA_EXTRASPACE defines the size of a raw memory area associated with
** a Lua state with very fast access.
** CHANGE it if you need a different size.
*/
const (
EXTRASPACE = unsafe.Sizeof(uintptr(0))
)
/*
@@ LUA_IDSIZE gives the maximum size for the description of the source
** of a function in debug information.
** CHANGE it if you want a different size.
*/
const (
IDSIZE = 60
)

View File

@@ -1,4 +1,5 @@
#include <stdlib.h>
#include <errno.h>
int llgoClearenv() {
extern char **environ;
@@ -7,3 +8,5 @@ int llgoClearenv() {
}
return 0;
}
int llgoErrno() { return errno; }

View File

@@ -70,8 +70,8 @@ type (
StatT = syscall.Stat_t
)
//go:linkname Errno errno
var Errno c.Int
//go:linkname Errno C.llgoErrno
func Errno() c.Int
//go:linkname Umask C.umask
func Umask(cmask ModeT) ModeT

View File

@@ -21,7 +21,8 @@ package os
import "C"
const (
LLGoPackage = "decl"
LLGoFiles = "_os/os.c"
LLGoPackage = "link"
)
//go:linkname Clearenv C.clearenv

View File

@@ -145,4 +145,4 @@ const (
EXDEV
EXFULL
EWINDOWS
)
)

View File

@@ -1,72 +0,0 @@
package config
import (
"errors"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/cjson"
"github.com/goplus/llgo/chore/llcppg/types"
)
type Conf struct {
*cjson.JSON
*types.Config
}
func GetConf(data []byte) (Conf, error) {
parsedConf := cjson.ParseBytes(data)
if parsedConf == nil {
return Conf{}, errors.New("failed to parse config")
}
config := &types.Config{
Name: GetStringItem(parsedConf, "name", ""),
CFlags: GetStringItem(parsedConf, "cflags", ""),
Libs: GetStringItem(parsedConf, "libs", ""),
Include: GetStringArrayItem(parsedConf, "include"),
TrimPrefixes: GetStringArrayItem(parsedConf, "trimPrefixes"),
Cplusplus: GetBoolItem(parsedConf, "cplusplus"),
}
return Conf{
JSON: parsedConf,
Config: config,
}, nil
}
func GetString(obj *cjson.JSON) (value string) {
str := obj.GetStringValue()
return unsafe.String((*byte)(unsafe.Pointer(str)), c.Strlen(str))
}
func GetStringItem(obj *cjson.JSON, key string, defval string) (value string) {
item := obj.GetObjectItemCaseSensitive(c.AllocaCStr(key))
if item == nil {
return defval
}
return GetString(item)
}
func GetStringArrayItem(obj *cjson.JSON, key string) (value []string) {
item := obj.GetObjectItemCaseSensitive(c.AllocaCStr(key))
if item == nil {
return
}
value = make([]string, item.GetArraySize())
for i := range value {
value[i] = GetString(item.GetArrayItem(c.Int(i)))
}
return
}
func GetBoolItem(obj *cjson.JSON, key string) bool {
item := obj.GetObjectItemCaseSensitive(c.AllocaCStr(key))
if item == nil {
return false
}
if item.IsBool() != 0 {
return item.IsTrue() != 0
}
return false
}

View File

@@ -1,228 +0,0 @@
/*
* 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 (
"errors"
"fmt"
"io"
"os"
"path/filepath"
"strings"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/cjson"
"github.com/goplus/llgo/chore/_xtool/llcppsymg/config"
"github.com/goplus/llgo/chore/_xtool/llcppsymg/parse"
"github.com/goplus/llgo/chore/llcppg/types"
"github.com/goplus/llgo/cpp/llvm"
"github.com/goplus/llgo/xtool/nm"
)
func main() {
cfgFile := "llcppg.cfg"
if len(os.Args) > 1 {
cfgFile = os.Args[1]
}
var data []byte
var err error
if cfgFile == "-" {
data, err = io.ReadAll(os.Stdin)
} else {
data, err = os.ReadFile(cfgFile)
}
check(err)
conf, err := config.GetConf(data)
check(err)
defer conf.Delete()
if err != nil {
fmt.Fprintln(os.Stderr, "Failed to parse config file:", cfgFile)
}
symbols, err := parseDylibSymbols(conf.Libs)
check(err)
filepaths := genHeaderFilePath(conf.CFlags, conf.Include)
headerInfos, err := parse.ParseHeaderFile(filepaths, conf.TrimPrefixes)
check(err)
symbolInfo := getCommonSymbols(symbols, headerInfos, conf.TrimPrefixes)
err = genSymbolTableFile(symbolInfo)
check(err)
}
func check(err error) {
if err != nil {
panic(err)
}
}
func parseDylibSymbols(lib string) ([]*nm.Symbol, error) {
dylibPath, err := genDylibPath(lib)
if err != nil {
return nil, errors.New("failed to generate dylib path")
}
files, err := nm.New("").List(dylibPath)
if err != nil {
return nil, errors.New("failed to list symbols in dylib")
}
var symbols []*nm.Symbol
for _, file := range files {
symbols = append(symbols, file.Symbols...)
}
return symbols, nil
}
func genDylibPath(lib string) (string, error) {
output := lib
libPath := ""
libName := ""
for _, part := range strings.Fields(string(output)) {
if strings.HasPrefix(part, "-L") {
libPath = part[2:]
} else if strings.HasPrefix(part, "-l") {
libName = part[2:]
}
}
if libPath == "" || libName == "" {
return "", fmt.Errorf("failed to parse pkg-config output: %s", output)
}
dylibPath := filepath.Join(libPath, "lib"+libName+".dylib")
return dylibPath, nil
}
func decodeSymbol(symbolName string) string {
if symbolName == "" {
return ""
}
demangled := llvm.ItaniumDemangle(symbolName, true)
if demangled == nil {
return symbolName
}
defer c.Free(unsafe.Pointer(demangled))
demangleName := c.GoString(demangled)
return strings.TrimSpace(demangleName)
}
func genHeaderFilePath(cflags string, files []string) []string {
prefixPath := cflags
prefixPath = strings.TrimPrefix(prefixPath, "-I")
var includePaths []string
for _, file := range files {
includePaths = append(includePaths, filepath.Join(prefixPath, "/"+file))
}
return includePaths
}
func getCommonSymbols(dylibSymbols []*nm.Symbol, symbolMap map[string]string, prefix []string) []*types.SymbolInfo {
var commonSymbols []*types.SymbolInfo
for _, dylibSym := range dylibSymbols {
symName := strings.TrimPrefix(dylibSym.Name, "_")
if goName, ok := symbolMap[symName]; ok {
symbolInfo := &types.SymbolInfo{
Mangle: symName,
CPP: decodeSymbol(dylibSym.Name),
Go: goName,
}
commonSymbols = append(commonSymbols, symbolInfo)
}
}
return commonSymbols
}
func genSymbolTableFile(symbolInfos []*types.SymbolInfo) error {
fileName := "llcppg.symb.json"
existingSymbols, err := readExistingSymbolTable(fileName)
if err != nil {
return err
}
for i := range symbolInfos {
if existingSymbol, exists := existingSymbols[symbolInfos[i].Mangle]; exists {
symbolInfos[i].Go = existingSymbol.Go
}
}
root := cjson.Array()
defer root.Delete()
for _, symbol := range symbolInfos {
item := cjson.Object()
item.SetItem(c.Str("mangle"), cjson.String(c.AllocaCStr(symbol.Mangle)))
item.SetItem(c.Str("c++"), cjson.String(c.AllocaCStr(symbol.CPP)))
item.SetItem(c.Str("go"), cjson.String(c.AllocaCStr(symbol.Go)))
root.AddItem(item)
}
cStr := root.Print()
if cStr == nil {
return errors.New("symbol table is empty")
}
defer c.Free(unsafe.Pointer(cStr))
data := unsafe.Slice((*byte)(unsafe.Pointer(cStr)), c.Strlen(cStr))
if err := os.WriteFile(fileName, data, 0644); err != nil {
return errors.New("failed to write symbol table file")
}
return nil
}
func readExistingSymbolTable(fileName string) (map[string]types.SymbolInfo, error) {
existingSymbols := make(map[string]types.SymbolInfo)
if _, err := os.Stat(fileName); err != nil {
return existingSymbols, nil
}
data, err := os.ReadFile(fileName)
if err != nil {
return nil, errors.New("failed to read symbol table file")
}
parsedJSON := cjson.ParseBytes(data)
if parsedJSON == nil {
return nil, errors.New("failed to parse JSON")
}
arraySize := parsedJSON.GetArraySize()
for i := 0; i < int(arraySize); i++ {
item := parsedJSON.GetArrayItem(c.Int(i))
if item == nil {
continue
}
symbol := types.SymbolInfo{
Mangle: config.GetStringItem(item, "mangle", ""),
CPP: config.GetStringItem(item, "c++", ""),
Go: config.GetStringItem(item, "go", ""),
}
existingSymbols[symbol.Mangle] = symbol
}
return existingSymbols, nil
}

View File

@@ -1,167 +0,0 @@
package parse
import (
"errors"
"strconv"
"strings"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/clang"
)
type Context struct {
namespaceName string
className string
prefixes []string
symbolMap map[string]string
currentFile string
nameCounts map[string]int
}
func newContext(prefixes []string) *Context {
return &Context{
prefixes: prefixes,
symbolMap: make(map[string]string),
nameCounts: make(map[string]int),
}
}
func (c *Context) setNamespaceName(name string) {
c.namespaceName = name
}
func (c *Context) setClassName(name string) {
c.className = name
}
func (c *Context) setCurrentFile(filename string) {
c.currentFile = filename
}
func (c *Context) removePrefix(str string) string {
for _, prefix := range c.prefixes {
if strings.HasPrefix(str, prefix) {
return strings.TrimPrefix(str, prefix)
}
}
return str
}
func (c *Context) genGoName(name string) string {
class := c.removePrefix(c.className)
name = c.removePrefix(name)
var baseName string
if class == "" {
baseName = name
} else {
baseName = c.genMethodName(class, name)
}
return c.addSuffix(baseName)
}
func (c *Context) genMethodName(class, name string) string {
prefix := "(*" + class + ")."
if class == name {
return prefix + "Init"
}
if name == "~"+class {
return prefix + "Dispose"
}
return prefix + name
}
func (c *Context) addSuffix(name string) string {
c.nameCounts[name]++
count := c.nameCounts[name]
if count > 1 {
return name + "__" + strconv.Itoa(count-1)
}
return name
}
var context = newContext([]string{})
func collectFuncInfo(cursor clang.Cursor) {
cursorStr := cursor.String()
symbol := cursor.Mangling()
name := c.GoString(cursorStr.CStr())
symbolName := c.GoString(symbol.CStr())
if len(symbolName) >= 1 && symbolName[0] == '_' {
symbolName = symbolName[1:]
}
defer symbol.Dispose()
defer cursorStr.Dispose()
goName := context.genGoName(name)
context.symbolMap[symbolName] = goName
}
func visit(cursor, parent clang.Cursor, clientData c.Pointer) clang.ChildVisitResult {
if cursor.Kind == clang.CursorNamespace {
nameStr := cursor.String()
defer nameStr.Dispose()
context.setNamespaceName(c.GoString(nameStr.CStr()))
clang.VisitChildren(cursor, visit, nil)
context.setNamespaceName("")
} else if cursor.Kind == clang.CursorClassDecl {
nameStr := cursor.String()
defer nameStr.Dispose()
context.setClassName(c.GoString(nameStr.CStr()))
clang.VisitChildren(cursor, visit, nil)
context.setClassName("")
} else if cursor.Kind == clang.CursorCXXMethod || cursor.Kind == clang.CursorFunctionDecl || cursor.Kind == clang.CursorConstructor || cursor.Kind == clang.CursorDestructor {
loc := cursor.Location()
var file clang.File
var line, column c.Uint
loc.SpellingLocation(&file, &line, &column, nil)
filename := file.FileName()
if c.Strcmp(filename.CStr(), c.AllocaCStr(context.currentFile)) == 0 {
collectFuncInfo(cursor)
}
defer filename.Dispose()
}
return clang.ChildVisit_Continue
}
func ParseHeaderFile(filepaths []string, prefixes []string) (map[string]string, error) {
index := clang.CreateIndex(0, 0)
args := make([]*c.Char, 3)
args[0] = c.Str("-x")
args[1] = c.Str("c++")
args[2] = c.Str("-std=c++11")
context = newContext(prefixes)
for _, filename := range filepaths {
unit := index.ParseTranslationUnit(
c.AllocaCStr(filename),
unsafe.SliceData(args), 3,
nil, 0,
clang.TranslationUnit_None,
)
if unit == nil {
return nil, errors.New("Unable to parse translation unit for file " + filename)
}
cursor := unit.Cursor()
context.setCurrentFile(filename)
clang.VisitChildren(cursor, visit, nil)
unit.Dispose()
}
index.Dispose()
return context.symbolMap, nil
}

View File

@@ -1,27 +0,0 @@
llcppg - Autogen tool for C/C++ libraries
====
## Usage
```sh
llcppg [config-file]
```
If `config-file` is not specified, a `llcppg.cfg` file is used in current directory. The configuration file format is as follows:
```json
{
"name": "inireader",
"cflags": "$(pkg-config --cflags inireader)",
"include": [
"INIReader.h",
"AnotherHeaderFile.h"
],
"libs": "$(pkg-config --libs inireader)",
"trimPrefixes": ["Ini", "INI"]
}
```
## Design
See [llcppg Design](design.md).

View File

@@ -1,378 +0,0 @@
/*
* 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 ast
import "github.com/goplus/llgo/chore/llcppg/token"
// =============================================================================
type Node interface {
}
type Expr interface {
Node
exprNode()
}
type Decl interface {
Node
declNode()
}
type Stmt interface {
Node
stmtNode()
}
type PPD interface { // preprocessing directive
Node
ppdNode()
}
// =============================================================================
type AccessSpecifier uint
const (
Invalid AccessSpecifier = iota
Public
Protected
Private
)
// =============================================================================
// Expressions (Types are also expressions)
type BasicLitKind uint
const (
IntLit BasicLitKind = iota
FloatLit
CharLit
StringLit
)
type BasicLit struct {
Kind BasicLitKind
Value string
}
func (*BasicLit) exprNode() {}
// ------------------------------------------------
type TypeKind uint
const (
Void TypeKind = iota
Bool
Char
Char16
Char32
WChar
Int
Int128
Float
Float16
Float128
Complex
)
type TypeFlag uint
const (
Signed TypeFlag = 1 << iota
Unsigned
Long
LongLong
Double
Short
)
// [signed/unsigned/short/long/long long/double] [int]/char/float/complex/bool
type BuiltinType struct {
Kind TypeKind
Flags TypeFlag
}
func (*BuiltinType) exprNode() {}
// ------------------------------------------------
// Name
type Ident struct {
Name string
}
func (*Ident) exprNode() {}
// ------------------------------------------------
type Tag int
const (
Struct Tag = iota
Union
Enum
Class
)
// struct/union/enum/class (A::B::)Name
type TagExpr struct {
Tag Tag
Name Expr // ScopingExpr, Ident
}
func (*TagExpr) exprNode() {}
// ------------------------------------------------
// type a, ...
type Variadic struct {
}
func (*Variadic) exprNode() {}
// ------------------------------------------------
// (X)
type ParenExpr struct {
X Expr
}
func (*ParenExpr) exprNode() {}
// ------------------------------------------------
// Parent::X
type ScopingExpr struct {
Parent Expr
X Expr
}
func (*ScopingExpr) exprNode() {}
// ------------------------------------------------
// X*
type PointerType struct {
X Expr
}
func (*PointerType) exprNode() {}
// ------------------------------------------------
// X&
type LvalueRefType struct {
X Expr
}
func (*LvalueRefType) exprNode() {}
// X&&
type RvalueRefType struct {
X Expr
}
func (*RvalueRefType) exprNode() {}
// ------------------------------------------------
// Elt[Len]
// Elt[]
type ArrayType struct {
Elt Expr
Len Expr // optional
}
func (*ArrayType) exprNode() {}
// ------------------------------------------------
type Comment struct {
Text string // comment text (excluding '\n' for //-style comments)
}
func (*Comment) exprNode() {}
type CommentGroup struct {
List []*Comment // len(List) > 0
}
func (*CommentGroup) exprNode() {}
// ------------------------------------------------
type Field struct {
Doc *CommentGroup // associated documentation; or nil
Type Expr // field/method/parameter type; or nil
Names []*Ident // field/method/(type) parameter names; or nil
Comment *CommentGroup // line comments; or nil
Access AccessSpecifier // field access(Record Type); Struct Field default is Public,Class Field default is Private
IsStatic bool // static field
}
func (*Field) exprNode() {}
type FieldList struct {
List []*Field // field list; or nil
}
func (*FieldList) exprNode() {}
// ------------------------------------------------
// Ret (*)(Params)
type FuncType struct {
Params *FieldList
Ret Expr
}
func (*FuncType) exprNode() {}
// ------------------------------------------------
type RecordType struct {
Tag Tag
Fields *FieldList
Methods []*FuncDecl
}
func (*RecordType) exprNode() {}
// ------------------------------------------------
// Template<Arg1, Arg2, ...>
type InstantiationType struct {
Template Expr
Args *FieldList
}
func (*InstantiationType) exprNode() {}
// =============================================================================
// Declarations
type Location struct {
File string
}
type DeclBase struct {
Doc *CommentGroup // associated documentation; or nil
Loc *Location
Parent Expr // namespace or class
}
// ------------------------------------------------
// typedef Type Name;
type TypedefDecl struct {
DeclBase
Type Expr
Name *Ident
}
func (*TypedefDecl) declNode() {}
// ------------------------------------------------
type EnumItem struct {
Name *Ident
Value Expr // optional
}
func (*EnumItem) exprNode() {}
type EnumType struct {
Items []*EnumItem
}
func (*EnumType) exprNode() {}
// enum Name { Item1, Item2, ... };
type EnumTypeDecl struct {
DeclBase
Name *Ident
Type *EnumType
}
func (*EnumTypeDecl) declNode() {}
// ------------------------------------------------
// Ret Name(Params);
type FuncDecl struct {
DeclBase
Name *Ident
Type *FuncType
IsInline bool
IsStatic bool
// Class method specific fields
IsConst bool // const member function
IsExplicit bool // explicit constructor
IsConstructor bool
IsDestructor bool
IsVirtual bool
IsOverride bool
}
func (*FuncDecl) declNode() {}
// ------------------------------------------------
// struct/union/class Name { Field1, Field2, ... };
type TypeDecl struct {
DeclBase
Name *Ident
Type *RecordType
}
func (*TypeDecl) declNode() {}
// =============================================================================
// AST File
type Include struct {
Path string `json:"path"`
}
func (*Include) ppdNode() {}
// ------------------------------------------------
type Token struct {
Token token.Token
Lit string
}
type Macro struct {
Name string
Tokens []*Token // Tokens[0].Lit is the macro name
}
func (*Macro) ppdNode() {}
// ------------------------------------------------
type File struct {
Decls []Decl `json:"decls"`
Includes []*Include `json:"includes,omitempty"`
Macros []*Macro `json:"macros,omitempty"`
}
// =============================================================================

View File

@@ -1,85 +0,0 @@
llcppg Design
=====
## Usage
```sh
llcppg [config-file]
```
If `config-file` is not specified, a `llcppg.cfg` file is used in current directory. The configuration file format is as follows:
```json
{
"name": "inih",
"cflags": "$(pkg-config --cflags inireader)",
"include": [
"INIReader.h",
"AnotherHeaderFile.h"
],
"libs": "$(pkg-config --libs inireader)",
"trimPrefixes": ["Ini", "INI"],
"cplusplus":true
}
```
## Steps
1. llcppsymg: Generate symbol table for a C/C++ library
2. Manually modify the desired Go symbols in symbol table
3. llcppsigfetch: Fetch information of C/C++ symbols
4. gogensig: Generate a go package by information of symbols
### llcppsymg
```sh
llcppsymg config-file
llcppsymg - # read config from stdin
```
It generates a symbol table file named `llcppg.symb.json`. Its file format is as follows:
```json
[
{
"mangle": "_ZN9INIReaderC1EPKcm",
"c++": "INIReader::INIReader(char const*, unsigned long)",
"go": "(*Reader).Init__0"
}
]
```
### llcppsigfetch
```sh
llcppsigfetch config-file
llcppsigfetch - # read config from stdin
```
It fetches information of C/C++ symbols and print to stdout. Its format is as follows:
```json
[
{
"path": "/path/to/file.h",
"doc": {
"decls": [],
"macros": [],
"includes": [
{
"path": "incfile.h"
}
]
}
}
]
```
### gogensig
```sh
gogensig ast-file
gogensig - # read AST from stdin
```

View File

@@ -1,92 +0,0 @@
/*
* 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"
"io"
"os"
"os/exec"
"github.com/goplus/llgo/chore/llcppg/types"
"github.com/goplus/llgo/xtool/env"
)
func llcppsymg(conf []byte) error {
cmd := exec.Command("llcppsymg", "-")
cmd.Stdin = bytes.NewReader(conf)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func llcppsigfetch(conf []byte, out io.Writer) {
cmd := exec.Command("llcppsigfetch", "-")
cmd.Stdin = bytes.NewReader(conf)
cmd.Stdout = out
cmd.Stderr = os.Stderr
err := cmd.Run()
check(err)
}
func gogensig(in io.Reader) error {
cmd := exec.Command("gogensig", "-")
cmd.Stdin = in
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func main() {
cfgFile := "llcppg.cfg"
if len(os.Args) > 1 {
cfgFile = os.Args[1]
}
if cfgFile == "-h" || cfgFile == "--help" {
fmt.Fprintln(os.Stderr, "Usage: llcppg [config-file]")
return
}
f, err := os.Open(cfgFile)
check(err)
defer f.Close()
var conf types.Config
json.NewDecoder(f).Decode(&conf)
conf.CFlags = env.ExpandEnv(conf.CFlags)
conf.Libs = env.ExpandEnv(conf.Libs)
b, err := json.MarshalIndent(&conf, "", " ")
check(err)
err = llcppsymg(b)
check(err)
r, w := io.Pipe()
go llcppsigfetch(b, w)
err = gogensig(r)
check(err)
}
func check(err error) {
if err != nil {
panic(err)
}
}

View File

@@ -1,32 +0,0 @@
package token
type Token uint
const (
ILLEGAL Token = iota
/**
* A token that contains some kind of punctuation.
*/
PUNCT
/**
* A language keyword.
*/
KEYWORD
/**
* An identifier (that is not a keyword).
*/
IDENT
/**
* A numeric, string, or character literal.
*/
LITERAL
/**
* A comment.
*/
COMMENT
)

View File

@@ -1,33 +0,0 @@
/*
* 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 types
// Config represents a configuration for the llcppg tool.
type Config struct {
Name string `json:"name"`
CFlags string `json:"cflags"`
Libs string `json:"libs"`
Include []string `json:"include"`
TrimPrefixes []string `json:"trimPrefixes"`
Cplusplus bool `json:"cplusplus"`
}
type SymbolInfo struct {
Mangle string `json:"mangle"` // C++ Symbol
CPP string `json:"c++"` // C++ function name
Go string `json:"go"` // Go function name
}

View File

@@ -1,29 +0,0 @@
; ModuleID = 'apkg'
source_filename = "apkg"
@"apkg.init$guard" = global i1 false, align 1
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
br i1 %0, label %_llgo_2, label %_llgo_1
_llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"apkg.init$guard", align 1
br label %_llgo_2
_llgo_2: ; preds = %_llgo_1, %_llgo_0
ret void
}

View File

@@ -1,22 +0,0 @@
; ModuleID = 'llgotag'
source_filename = "llgotag"
@"llgotag.init$guard" = global i1 false, align 1
define void @llgotag.Foo() {
_llgo_0:
ret void
}
define void @llgotag.init() {
_llgo_0:
%0 = load i1, ptr @"llgotag.init$guard", align 1
br i1 %0, label %_llgo_2, label %_llgo_1
_llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"llgotag.init$guard", align 1
br label %_llgo_2
_llgo_2: ; preds = %_llgo_1, %_llgo_0
ret void
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,106 +0,0 @@
; ModuleID = 'main'
source_filename = "main"
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
@main.array = global [8 x i8] zeroinitializer, align 1
@"main.init$guard" = global i1 false, align 1
@__llgo_argc = global i32 0, align 4
@__llgo_argv = global ptr null, align 8
@0 = private unnamed_addr constant [7 x i8] c"\E4\B8\ADabcd", align 1
define i8 @main.index(i8 %0) {
_llgo_0:
%1 = sext i8 %0 to i64
%2 = icmp slt i64 %1, 0
%3 = icmp sge i64 %1, 8
%4 = or i1 %3, %2
call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %4)
%5 = getelementptr inbounds i8, ptr @main.array, i64 %1
%6 = load i8, ptr %5, align 1
ret i8 %6
}
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.StringSlice"(%"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 @0, 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.StringSlice"(%"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)

View File

@@ -1,167 +0,0 @@
; 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 i1 false, align 1
@__llgo_argc = global i32 0, align 4
@__llgo_argv = global ptr null, align 8
@_llgo_int = linkonce global ptr null, align 8
@0 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
@1 = private unnamed_addr constant [21 x i8] c"type assertion failed", align 1
@_llgo_string = linkonce global ptr null, align 8
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$after"()
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 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0
%6 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1
%7 = icmp slt i64 %3, 0
%8 = icmp sge i64 %3, %6
%9 = or i1 %8, %7
call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %9)
%10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %5, i64 %3
%11 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %10, align 8
%12 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %11, 0
%13 = load ptr, ptr @_llgo_int, align 8
%14 = icmp eq ptr %12, %13
br i1 %14, label %_llgo_4, label %_llgo_5
_llgo_3: ; preds = %_llgo_1
ret void
_llgo_4: ; preds = %_llgo_2
%15 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %11, 1
%16 = ptrtoint ptr %15 to i64
%17 = call i32 (ptr, ...) @printf(ptr @0, i64 %16)
br label %_llgo_1
_llgo_5: ; preds = %_llgo_2
%18 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i32 0, i32 0
store ptr @1, ptr %19, align 8
%20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i32 0, i32 1
store i64 21, ptr %20, align 4
%21 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %18, align 8
%22 = load ptr, ptr @_llgo_string, align 8
%23 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %21, ptr %23, align 8
%24 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %24, i32 0, i32 0
store ptr %22, ptr %25, align 8
%26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %24, i32 0, i32 1
store ptr %23, ptr %26, align 8
%27 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %24, align 8
call void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface" %27)
unreachable
}
declare void @"github.com/goplus/llgo/internal/runtime.init"()
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
define void @"main.init$after"() {
_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 34)
store ptr %2, ptr @_llgo_int, align 8
br label %_llgo_2
_llgo_2: ; preds = %_llgo_1, %_llgo_0
%3 = load ptr, ptr @_llgo_string, 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 24)
store ptr %5, ptr @_llgo_string, 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 void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1)
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
declare void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface")
declare i32 @printf(ptr, ...)

View File

@@ -1,119 +0,0 @@
; ModuleID = 'main'
source_filename = "main"
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
%main.T = type { ptr, ptr }
@"main.init$guard" = global i1 false, align 1
@__llgo_argc = global i32 0, align 4
@__llgo_argv = global ptr null, align 8
@0 = private unnamed_addr constant [3 x i8] c"env", align 1
@1 = private unnamed_addr constant [4 x i8] c"func", align 1
@2 = private unnamed_addr constant [7 x i8] c"closure", 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()
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16)
%3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0
store ptr @0, ptr %4, align 8
%5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1
store i64 3, ptr %5, align 4
%6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %6, ptr %2, align 8
%7 = alloca %main.T, align 8
%8 = getelementptr inbounds %main.T, ptr %7, i32 0, i32 0
store ptr @"__llgo_stub.main.main$1", ptr %8, align 8
%9 = getelementptr inbounds %main.T, ptr %7, i32 0, i32 1
store ptr null, ptr %9, align 8
%10 = load %main.T, ptr %7, align 8
%11 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8)
%12 = getelementptr inbounds { ptr }, ptr %11, i32 0, i32 0
store ptr %2, ptr %12, align 8
%13 = alloca { ptr, ptr }, align 8
%14 = getelementptr inbounds { ptr, ptr }, ptr %13, i32 0, i32 0
store ptr @"main.main$2", ptr %14, align 8
%15 = getelementptr inbounds { ptr, ptr }, ptr %13, i32 0, i32 1
store ptr %11, ptr %15, align 8
%16 = load { ptr, ptr }, ptr %13, align 8
%17 = alloca %main.T, align 8
store { ptr, ptr } %16, ptr %17, align 8
%18 = load %main.T, ptr %17, align 8
%19 = extractvalue %main.T %10, 1
%20 = extractvalue %main.T %10, 0
call void %20(ptr %19, i64 100)
%21 = extractvalue %main.T %18, 1
%22 = extractvalue %main.T %18, 0
call void %22(ptr %21, i64 200)
ret i32 0
}
define void @"main.main$1"(i64 %0) {
_llgo_0:
%1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0
store ptr @1, ptr %2, align 8
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1
store i64 4, ptr %3, align 4
%4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %4)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %0)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
ret void
}
define void @"main.main$2"(ptr %0, i64 %1) {
_llgo_0:
%2 = load { ptr }, ptr %0, align 8
%3 = extractvalue { ptr } %2, 0
%4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, 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 @2, ptr %6, align 8
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1
store i64 7, ptr %7, align 4
%8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %8)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32)
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %1)
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" %4)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
ret void
}
declare void @"github.com/goplus/llgo/internal/runtime.init"()
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
define linkonce void @"__llgo_stub.main.main$1"(ptr %0, i64 %1) {
_llgo_0:
tail call void @"main.main$1"(i64 %1)
ret void
}
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64)

View File

@@ -1,926 +0,0 @@
; ModuleID = 'main'
source_filename = "main"
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr }
%main.T = type { i64, i64, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.eface" }
%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 }
%main.N = type {}
%"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 i1 false, align 1
@0 = private unnamed_addr constant [6 x i8] c"failed", align 1
@_llgo_string = linkonce global ptr null, align 8
@1 = private unnamed_addr constant [5 x i8] c"hello", align 1
@_llgo_int = linkonce global ptr null, align 8
@2 = private unnamed_addr constant [2 x i8] c"ok", align 1
@"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw" = linkonce global ptr null, align 8
@3 = private unnamed_addr constant [4 x i8] c"main", align 1
@_llgo_main.T = linkonce global ptr null, align 8
@"_llgo_struct$5D_KhR3tDEp-wpx9caTiVZca43wS-XW6slE9Bsr8rsk" = linkonce global ptr null, align 8
@4 = private unnamed_addr constant [1 x i8] c"X", align 1
@5 = private unnamed_addr constant [1 x i8] c"Y", align 1
@6 = private unnamed_addr constant [1 x i8] c"Z", align 1
@7 = private unnamed_addr constant [1 x i8] c"V", align 1
@8 = private unnamed_addr constant [1 x i8] c"T", align 1
@_llgo_main.N = linkonce global ptr null, align 8
@9 = private unnamed_addr constant [1 x i8] c"N", align 1
@"map[_llgo_int]_llgo_string" = linkonce global ptr null, align 8
@10 = private unnamed_addr constant [7 x i8] c"topbits", align 1
@11 = private unnamed_addr constant [4 x i8] c"keys", align 1
@12 = private unnamed_addr constant [5 x i8] c"elems", align 1
@13 = private unnamed_addr constant [8 x i8] c"overflow", align 1
@__llgo_argc = global i32 0, align 4
@__llgo_argv = global ptr null, align 8
define void @main.assert(i1 %0) {
_llgo_0:
br i1 %0, label %_llgo_2, label %_llgo_1
_llgo_1: ; preds = %_llgo_0
%1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0
store ptr @0, ptr %2, align 8
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1
store i64 6, ptr %3, align 4
%4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8
%5 = load ptr, ptr @_llgo_string, align 8
%6 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %4, ptr %6, align 8
%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 %5, 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
call void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface" %10)
unreachable
_llgo_2: ; preds = %_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
call void @"main.init$after"()
call void @"main.init#1"()
call void @"main.init#2"()
call void @"main.init#3"()
call void @"main.init#4"()
call void @"main.init#5"()
call void @"main.init#6"()
call void @"main.init#7"()
br label %_llgo_2
_llgo_2: ; preds = %_llgo_1, %_llgo_0
ret void
}
define void @"main.init#1"() {
_llgo_0:
%0 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 8)
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8)
%2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0
store ptr %0, ptr %2, align 8
%3 = alloca { ptr, ptr }, align 8
%4 = getelementptr inbounds { ptr, ptr }, ptr %3, i32 0, i32 0
store ptr @"main.init#1$2", ptr %4, align 8
%5 = getelementptr inbounds { ptr, ptr }, ptr %3, i32 0, i32 1
store ptr %1, ptr %5, align 8
%6 = load { ptr, ptr }, ptr %3, align 8
call void @main.assert(i1 true)
call void @main.assert(i1 true)
call void @main.assert(i1 true)
call void @main.assert(i1 true)
call void @main.assert(i1 true)
call void @main.assert(i1 true)
%7 = extractvalue { ptr, ptr } %6, 0
%8 = icmp ne ptr %7, null
call void @main.assert(i1 %8)
%9 = extractvalue { ptr, ptr } %6, 0
%10 = icmp ne ptr null, %9
call void @main.assert(i1 %10)
call void @main.assert(i1 true)
call void @main.assert(i1 true)
ret void
}
define i64 @"main.init#1$1"(i64 %0, i64 %1) {
_llgo_0:
%2 = add i64 %0, %1
ret i64 %2
}
define void @"main.init#1$2"(ptr %0) {
_llgo_0:
%1 = load { ptr }, ptr %0, align 8
%2 = extractvalue { ptr } %1, 0
%3 = load i64, ptr %2, align 4
call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %3)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
ret void
}
define void @"main.init#2"() {
_llgo_0:
call void @main.assert(i1 true)
%0 = alloca [3 x i64], align 8
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %0, i64 24)
%2 = getelementptr inbounds i64, ptr %1, i64 0
%3 = getelementptr inbounds i64, ptr %1, i64 1
%4 = getelementptr inbounds i64, ptr %1, i64 2
store i64 1, ptr %2, align 4
store i64 2, ptr %3, align 4
store i64 3, ptr %4, align 4
%5 = alloca [3 x i64], align 8
%6 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %5, i64 24)
%7 = getelementptr inbounds i64, ptr %6, i64 0
%8 = getelementptr inbounds i64, ptr %6, i64 1
%9 = getelementptr inbounds i64, ptr %6, i64 2
store i64 1, ptr %7, align 4
store i64 2, ptr %8, align 4
store i64 3, ptr %9, align 4
%10 = load [3 x i64], ptr %1, align 4
%11 = load [3 x i64], ptr %6, align 4
%12 = extractvalue [3 x i64] %10, 0
%13 = extractvalue [3 x i64] %11, 0
%14 = icmp eq i64 %12, %13
%15 = and i1 true, %14
%16 = extractvalue [3 x i64] %10, 1
%17 = extractvalue [3 x i64] %11, 1
%18 = icmp eq i64 %16, %17
%19 = and i1 %15, %18
%20 = extractvalue [3 x i64] %10, 2
%21 = extractvalue [3 x i64] %11, 2
%22 = icmp eq i64 %20, %21
%23 = and i1 %19, %22
call void @main.assert(i1 %23)
%24 = getelementptr inbounds i64, ptr %6, i64 1
store i64 1, ptr %24, align 4
%25 = load [3 x i64], ptr %1, align 4
%26 = load [3 x i64], ptr %6, align 4
%27 = extractvalue [3 x i64] %25, 0
%28 = extractvalue [3 x i64] %26, 0
%29 = icmp eq i64 %27, %28
%30 = and i1 true, %29
%31 = extractvalue [3 x i64] %25, 1
%32 = extractvalue [3 x i64] %26, 1
%33 = icmp eq i64 %31, %32
%34 = and i1 %30, %33
%35 = extractvalue [3 x i64] %25, 2
%36 = extractvalue [3 x i64] %26, 2
%37 = icmp eq i64 %35, %36
%38 = and i1 %34, %37
%39 = xor i1 %38, true
call void @main.assert(i1 %39)
ret void
}
define void @"main.init#3"() {
_llgo_0:
%0 = alloca %main.T, align 8
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %0, i64 48)
%2 = getelementptr inbounds %main.T, ptr %1, i32 0, i32 0
%3 = getelementptr inbounds %main.T, ptr %1, i32 0, i32 1
%4 = getelementptr inbounds %main.T, ptr %1, i32 0, i32 2
%5 = getelementptr inbounds %main.T, ptr %1, i32 0, i32 3
store i64 10, ptr %2, align 4
store i64 20, ptr %3, align 4
%6 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %6, i32 0, i32 0
store ptr @1, ptr %7, align 8
%8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %6, i32 0, i32 1
store i64 5, ptr %8, align 4
%9 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %6, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %9, ptr %4, align 8
%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 1 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 %5, align 8
%15 = alloca %main.T, align 8
%16 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %15, i64 48)
%17 = getelementptr inbounds %main.T, ptr %16, i32 0, i32 0
%18 = getelementptr inbounds %main.T, ptr %16, i32 0, i32 1
%19 = getelementptr inbounds %main.T, ptr %16, i32 0, i32 2
%20 = getelementptr inbounds %main.T, ptr %16, i32 0, i32 3
store i64 10, ptr %17, align 4
store i64 20, ptr %18, align 4
%21 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 0
store ptr @1, ptr %22, align 8
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 1
store i64 5, ptr %23, align 4
%24 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %21, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %24, ptr %19, align 8
%25 = load ptr, ptr @_llgo_int, align 8
%26 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%27 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %26, i32 0, i32 0
store ptr %25, ptr %27, align 8
%28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %26, i32 0, i32 1
store ptr inttoptr (i64 1 to ptr), ptr %28, align 8
%29 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %26, align 8
store %"github.com/goplus/llgo/internal/runtime.eface" %29, ptr %20, align 8
%30 = alloca %main.T, align 8
%31 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %30, i64 48)
%32 = getelementptr inbounds %main.T, ptr %31, i32 0, i32 0
%33 = getelementptr inbounds %main.T, ptr %31, i32 0, i32 1
%34 = getelementptr inbounds %main.T, ptr %31, i32 0, i32 2
%35 = getelementptr inbounds %main.T, ptr %31, i32 0, i32 3
store i64 10, ptr %32, align 4
store i64 20, ptr %33, align 4
%36 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %36, i32 0, i32 0
store ptr @1, ptr %37, align 8
%38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %36, i32 0, i32 1
store i64 5, ptr %38, align 4
%39 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %36, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %39, ptr %34, align 8
%40 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 0
store ptr @2, ptr %41, align 8
%42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 1
store i64 2, ptr %42, align 4
%43 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %40, align 8
%44 = load ptr, ptr @_llgo_string, align 8
%45 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %43, ptr %45, align 8
%46 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%47 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %46, i32 0, i32 0
store ptr %44, ptr %47, align 8
%48 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %46, i32 0, i32 1
store ptr %45, ptr %48, align 8
%49 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %46, align 8
store %"github.com/goplus/llgo/internal/runtime.eface" %49, ptr %35, align 8
call void @main.assert(i1 true)
%50 = call i1 @"github.com/goplus/llgo/internal/runtime.StringEqual"(%"github.com/goplus/llgo/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/internal/runtime.String" zeroinitializer)
%51 = and i1 true, %50
%52 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer, %"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer)
%53 = and i1 %51, %52
call void @main.assert(i1 %53)
%54 = load %main.T, ptr %1, align 8
%55 = load %main.T, ptr %16, align 8
%56 = extractvalue %main.T %54, 0
%57 = extractvalue %main.T %55, 0
%58 = icmp eq i64 %56, %57
%59 = and i1 true, %58
%60 = extractvalue %main.T %54, 1
%61 = extractvalue %main.T %55, 1
%62 = icmp eq i64 %60, %61
%63 = and i1 %59, %62
%64 = extractvalue %main.T %54, 2
%65 = extractvalue %main.T %55, 2
%66 = call i1 @"github.com/goplus/llgo/internal/runtime.StringEqual"(%"github.com/goplus/llgo/internal/runtime.String" %64, %"github.com/goplus/llgo/internal/runtime.String" %65)
%67 = and i1 %63, %66
%68 = extractvalue %main.T %54, 3
%69 = extractvalue %main.T %55, 3
%70 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %68, %"github.com/goplus/llgo/internal/runtime.eface" %69)
%71 = and i1 %67, %70
call void @main.assert(i1 %71)
%72 = load %main.T, ptr %1, align 8
%73 = load %main.T, ptr %31, align 8
%74 = extractvalue %main.T %72, 0
%75 = extractvalue %main.T %73, 0
%76 = icmp eq i64 %74, %75
%77 = and i1 true, %76
%78 = extractvalue %main.T %72, 1
%79 = extractvalue %main.T %73, 1
%80 = icmp eq i64 %78, %79
%81 = and i1 %77, %80
%82 = extractvalue %main.T %72, 2
%83 = extractvalue %main.T %73, 2
%84 = call i1 @"github.com/goplus/llgo/internal/runtime.StringEqual"(%"github.com/goplus/llgo/internal/runtime.String" %82, %"github.com/goplus/llgo/internal/runtime.String" %83)
%85 = and i1 %81, %84
%86 = extractvalue %main.T %72, 3
%87 = extractvalue %main.T %73, 3
%88 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %86, %"github.com/goplus/llgo/internal/runtime.eface" %87)
%89 = and i1 %85, %88
%90 = xor i1 %89, true
call void @main.assert(i1 %90)
%91 = load %main.T, ptr %16, align 8
%92 = load %main.T, ptr %31, align 8
%93 = extractvalue %main.T %91, 0
%94 = extractvalue %main.T %92, 0
%95 = icmp eq i64 %93, %94
%96 = and i1 true, %95
%97 = extractvalue %main.T %91, 1
%98 = extractvalue %main.T %92, 1
%99 = icmp eq i64 %97, %98
%100 = and i1 %96, %99
%101 = extractvalue %main.T %91, 2
%102 = extractvalue %main.T %92, 2
%103 = call i1 @"github.com/goplus/llgo/internal/runtime.StringEqual"(%"github.com/goplus/llgo/internal/runtime.String" %101, %"github.com/goplus/llgo/internal/runtime.String" %102)
%104 = and i1 %100, %103
%105 = extractvalue %main.T %91, 3
%106 = extractvalue %main.T %92, 3
%107 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %105, %"github.com/goplus/llgo/internal/runtime.eface" %106)
%108 = and i1 %104, %107
%109 = xor i1 %108, true
call void @main.assert(i1 %109)
ret void
}
define void @"main.init#4"() {
_llgo_0:
%0 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 24)
%1 = getelementptr inbounds i64, ptr %0, i64 0
store i64 1, ptr %1, align 4
%2 = getelementptr inbounds i64, ptr %0, i64 1
store i64 2, ptr %2, align 4
%3 = getelementptr inbounds i64, ptr %0, i64 2
store i64 3, ptr %3, align 4
%4 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, i32 0, i32 0
store ptr %0, ptr %5, align 8
%6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, i32 0, i32 1
store i64 3, ptr %6, align 4
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, i32 0, i32 2
store i64 3, ptr %7, align 4
%8 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, align 8
%9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16)
%10 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %9, i64 8, i64 2, i64 0, i64 2, i64 2)
%11 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16)
%12 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %11, i64 8, i64 2, i64 0, i64 0, i64 2)
call void @main.assert(i1 true)
%13 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %8, 0
%14 = icmp ne ptr %13, null
call void @main.assert(i1 %14)
%15 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %10, 0
%16 = icmp ne ptr %15, null
call void @main.assert(i1 %16)
%17 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %12, 0
%18 = icmp ne ptr %17, null
call void @main.assert(i1 %18)
call void @main.assert(i1 true)
ret void
}
define void @"main.init#5"() {
_llgo_0:
%0 = load ptr, ptr @_llgo_int, align 8
%1 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %1, i32 0, i32 0
store ptr %0, ptr %2, align 8
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %1, i32 0, i32 1
store ptr inttoptr (i64 100 to ptr), ptr %3, align 8
%4 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %1, align 8
%5 = load ptr, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8
%6 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
store {} zeroinitializer, ptr %6, align 1
%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 %5, 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
%11 = alloca %main.T, align 8
%12 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %11, i64 48)
%13 = getelementptr inbounds %main.T, ptr %12, i32 0, i32 0
%14 = getelementptr inbounds %main.T, ptr %12, i32 0, i32 1
%15 = getelementptr inbounds %main.T, ptr %12, i32 0, i32 2
%16 = getelementptr inbounds %main.T, ptr %12, i32 0, i32 3
store i64 10, ptr %13, align 4
store i64 20, ptr %14, align 4
%17 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 0
store ptr @1, ptr %18, align 8
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 1
store i64 5, ptr %19, align 4
%20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %17, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %20, ptr %15, align 8
%21 = load ptr, ptr @_llgo_int, align 8
%22 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %22, i32 0, i32 0
store ptr %21, ptr %23, align 8
%24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %22, i32 0, i32 1
store ptr inttoptr (i64 1 to ptr), ptr %24, align 8
%25 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %22, align 8
store %"github.com/goplus/llgo/internal/runtime.eface" %25, ptr %16, align 8
%26 = load %main.T, ptr %12, align 8
%27 = load ptr, ptr @_llgo_main.T, align 8
%28 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48)
store %main.T %26, ptr %28, align 8
%29 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %29, i32 0, i32 0
store ptr %27, ptr %30, align 8
%31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %29, i32 0, i32 1
store ptr %28, ptr %31, align 8
%32 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %29, align 8
%33 = alloca %main.T, align 8
%34 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %33, i64 48)
%35 = getelementptr inbounds %main.T, ptr %34, i32 0, i32 0
%36 = getelementptr inbounds %main.T, ptr %34, i32 0, i32 1
%37 = getelementptr inbounds %main.T, ptr %34, i32 0, i32 2
%38 = getelementptr inbounds %main.T, ptr %34, i32 0, i32 3
store i64 10, ptr %35, align 4
store i64 20, ptr %36, align 4
%39 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %39, i32 0, i32 0
store ptr @1, ptr %40, align 8
%41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %39, i32 0, i32 1
store i64 5, ptr %41, align 4
%42 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %39, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %42, ptr %37, align 8
%43 = load ptr, ptr @_llgo_int, align 8
%44 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %44, i32 0, i32 0
store ptr %43, ptr %45, align 8
%46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %44, i32 0, i32 1
store ptr inttoptr (i64 1 to ptr), ptr %46, align 8
%47 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %44, align 8
store %"github.com/goplus/llgo/internal/runtime.eface" %47, ptr %38, align 8
%48 = alloca %main.T, align 8
%49 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %48, i64 48)
%50 = getelementptr inbounds %main.T, ptr %49, i32 0, i32 0
%51 = getelementptr inbounds %main.T, ptr %49, i32 0, i32 1
%52 = getelementptr inbounds %main.T, ptr %49, i32 0, i32 2
%53 = getelementptr inbounds %main.T, ptr %49, i32 0, i32 3
store i64 10, ptr %50, align 4
store i64 20, ptr %51, align 4
%54 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%55 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %54, i32 0, i32 0
store ptr @1, ptr %55, align 8
%56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %54, i32 0, i32 1
store i64 5, ptr %56, align 4
%57 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %54, align 8
store %"github.com/goplus/llgo/internal/runtime.String" %57, ptr %52, align 8
%58 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %58, i32 0, i32 0
store ptr @2, ptr %59, align 8
%60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %58, i32 0, i32 1
store i64 2, ptr %60, align 4
%61 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %58, align 8
%62 = load ptr, ptr @_llgo_string, align 8
%63 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16)
store %"github.com/goplus/llgo/internal/runtime.String" %61, ptr %63, align 8
%64 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%65 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %64, i32 0, i32 0
store ptr %62, ptr %65, align 8
%66 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %64, i32 0, i32 1
store ptr %63, ptr %66, align 8
%67 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %64, align 8
store %"github.com/goplus/llgo/internal/runtime.eface" %67, ptr %53, align 8
%68 = load ptr, ptr @_llgo_int, align 8
%69 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%70 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %69, i32 0, i32 0
store ptr %68, ptr %70, align 8
%71 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %69, i32 0, i32 1
store ptr inttoptr (i64 100 to ptr), ptr %71, align 8
%72 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %69, align 8
%73 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %4, %"github.com/goplus/llgo/internal/runtime.eface" %72)
call void @main.assert(i1 %73)
%74 = load ptr, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8
%75 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
store {} zeroinitializer, ptr %75, align 1
%76 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %76, i32 0, i32 0
store ptr %74, ptr %77, align 8
%78 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %76, i32 0, i32 1
store ptr %75, ptr %78, align 8
%79 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %76, align 8
%80 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %10, %"github.com/goplus/llgo/internal/runtime.eface" %79)
call void @main.assert(i1 %80)
%81 = load ptr, ptr @_llgo_main.N, align 8
%82 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
store %main.N zeroinitializer, ptr %82, align 1
%83 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%84 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %83, i32 0, i32 0
store ptr %81, ptr %84, align 8
%85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %83, i32 0, i32 1
store ptr %82, ptr %85, align 8
%86 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %83, align 8
%87 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %10, %"github.com/goplus/llgo/internal/runtime.eface" %86)
%88 = xor i1 %87, true
call void @main.assert(i1 %88)
%89 = load %main.T, ptr %34, align 8
%90 = load ptr, ptr @_llgo_main.T, align 8
%91 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48)
store %main.T %89, ptr %91, align 8
%92 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%93 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %92, i32 0, i32 0
store ptr %90, ptr %93, align 8
%94 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %92, i32 0, i32 1
store ptr %91, ptr %94, align 8
%95 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %92, align 8
%96 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %32, %"github.com/goplus/llgo/internal/runtime.eface" %95)
call void @main.assert(i1 %96)
%97 = load %main.T, ptr %49, align 8
%98 = load ptr, ptr @_llgo_main.T, align 8
%99 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48)
store %main.T %97, ptr %99, align 8
%100 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8
%101 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %100, i32 0, i32 0
store ptr %98, ptr %101, align 8
%102 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %100, i32 0, i32 1
store ptr %99, ptr %102, align 8
%103 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %100, align 8
%104 = call i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface" %32, %"github.com/goplus/llgo/internal/runtime.eface" %103)
%105 = xor i1 %104, true
call void @main.assert(i1 %105)
ret void
}
define void @"main.init#6"() {
_llgo_0:
%0 = call ptr @"github.com/goplus/llgo/internal/runtime.NewChan"(i64 8, i64 0)
%1 = call ptr @"github.com/goplus/llgo/internal/runtime.NewChan"(i64 8, i64 0)
%2 = icmp eq ptr %0, %0
call void @main.assert(i1 %2)
%3 = icmp ne ptr %0, %1
call void @main.assert(i1 %3)
%4 = icmp ne ptr %0, null
call void @main.assert(i1 %4)
ret void
}
define void @"main.init#7"() {
_llgo_0:
%0 = load ptr, ptr @_llgo_int, align 8
%1 = load ptr, ptr @_llgo_string, align 8
%2 = load ptr, ptr @"map[_llgo_int]_llgo_string", align 8
%3 = call ptr @"github.com/goplus/llgo/internal/runtime.MakeMap"(ptr %2, i64 0)
%4 = icmp ne ptr %3, null
call void @main.assert(i1 %4)
call void @main.assert(i1 true)
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()
ret i32 0
}
define void @main.test() {
_llgo_0:
ret void
}
define void @"main.init$after"() {
_llgo_0:
%0 = load ptr, ptr @_llgo_string, 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 24)
store ptr %2, ptr @_llgo_string, 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 34)
store ptr %5, ptr @_llgo_int, align 8
br label %_llgo_4
_llgo_4: ; preds = %_llgo_3, %_llgo_2
%6 = load ptr, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8
%7 = icmp eq ptr %6, null
br i1 %7, label %_llgo_5, label %_llgo_6
_llgo_5: ; preds = %_llgo_4
%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 @3, ptr %9, align 8
%10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %8, i32 0, i32 1
store i64 4, ptr %10, align 4
%11 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %8, align 8
%12 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
%13 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, i32 0, i32 0
store ptr %12, ptr %14, align 8
%15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, i32 0, i32 1
store i64 0, ptr %15, align 4
%16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, i32 0, i32 2
store i64 0, ptr %16, align 4
%17 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, align 8
%18 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %11, i64 0, %"github.com/goplus/llgo/internal/runtime.Slice" %17)
store ptr %18, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8
br label %_llgo_6
_llgo_6: ; preds = %_llgo_5, %_llgo_4
%19 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 48, i64 0, i64 0)
%20 = load ptr, ptr @_llgo_main.T, align 8
%21 = icmp eq ptr %20, null
br i1 %21, label %_llgo_7, label %_llgo_8
_llgo_7: ; preds = %_llgo_6
store ptr %19, ptr @_llgo_main.T, align 8
br label %_llgo_8
_llgo_8: ; preds = %_llgo_7, %_llgo_6
%22 = load ptr, ptr @"_llgo_struct$5D_KhR3tDEp-wpx9caTiVZca43wS-XW6slE9Bsr8rsk", align 8
%23 = icmp eq ptr %22, null
br i1 %23, label %_llgo_9, label %_llgo_10
_llgo_9: ; preds = %_llgo_8
%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 @4, 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 null, 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 ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 34)
%33 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %27, ptr %32, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %31, i1 false)
%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 @5, ptr %35, align 8
%36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 1
store i64 1, ptr %36, align 4
%37 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %34, align 8
%38 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %38, i32 0, i32 0
store ptr null, ptr %39, align 8
%40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %38, i32 0, i32 1
store i64 0, ptr %40, align 4
%41 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %38, align 8
%42 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 34)
%43 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %37, ptr %42, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %41, i1 false)
%44 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %44, i32 0, i32 0
store ptr @6, ptr %45, align 8
%46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %44, i32 0, i32 1
store i64 1, ptr %46, align 4
%47 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %44, align 8
%48 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %48, i32 0, i32 0
store ptr null, ptr %49, align 8
%50 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %48, i32 0, i32 1
store i64 0, ptr %50, align 4
%51 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %48, align 8
%52 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
%53 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %47, ptr %52, i64 16, %"github.com/goplus/llgo/internal/runtime.String" %51, i1 false)
%54 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%55 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %54, i32 0, i32 0
store ptr @7, ptr %55, align 8
%56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %54, i32 0, i32 1
store i64 1, ptr %56, align 4
%57 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %54, align 8
%58 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %58, i32 0, i32 0
store ptr null, ptr %59, align 8
%60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %58, i32 0, i32 1
store i64 0, ptr %60, align 4
%61 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %58, align 8
%62 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0)
%63 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%64 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %63, i32 0, i32 0
store ptr %62, ptr %64, align 8
%65 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %63, i32 0, i32 1
store i64 0, ptr %65, align 4
%66 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %63, i32 0, i32 2
store i64 0, ptr %66, align 4
%67 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %63, align 8
%68 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %68, i32 0, i32 0
store ptr @3, ptr %69, align 8
%70 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %68, i32 0, i32 1
store i64 4, ptr %70, align 4
%71 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %68, align 8
%72 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%73 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %72, i32 0, i32 0
store ptr null, ptr %73, align 8
%74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %72, i32 0, i32 1
store i64 0, ptr %74, align 4
%75 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %72, align 8
%76 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %71, %"github.com/goplus/llgo/internal/runtime.String" %75, %"github.com/goplus/llgo/internal/runtime.Slice" %67)
%77 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %57, ptr %76, i64 32, %"github.com/goplus/llgo/internal/runtime.String" %61, i1 false)
%78 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%79 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %78, i32 0, i32 0
store ptr @3, ptr %79, align 8
%80 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %78, i32 0, i32 1
store i64 4, ptr %80, align 4
%81 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %78, align 8
%82 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 224)
%83 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %82, i64 0
store %"github.com/goplus/llgo/internal/abi.StructField" %33, ptr %83, align 8
%84 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %82, i64 1
store %"github.com/goplus/llgo/internal/abi.StructField" %43, ptr %84, align 8
%85 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %82, i64 2
store %"github.com/goplus/llgo/internal/abi.StructField" %53, ptr %85, align 8
%86 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %82, i64 3
store %"github.com/goplus/llgo/internal/abi.StructField" %77, ptr %86, align 8
%87 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%88 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %87, i32 0, i32 0
store ptr %82, ptr %88, align 8
%89 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %87, i32 0, i32 1
store i64 4, ptr %89, align 4
%90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %87, i32 0, i32 2
store i64 4, ptr %90, align 4
%91 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %87, align 8
%92 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %81, i64 48, %"github.com/goplus/llgo/internal/runtime.Slice" %91)
store ptr %92, ptr @"_llgo_struct$5D_KhR3tDEp-wpx9caTiVZca43wS-XW6slE9Bsr8rsk", align 8
br label %_llgo_10
_llgo_10: ; preds = %_llgo_9, %_llgo_8
%93 = load ptr, ptr @"_llgo_struct$5D_KhR3tDEp-wpx9caTiVZca43wS-XW6slE9Bsr8rsk", align 8
br i1 %21, label %_llgo_11, label %_llgo_12
_llgo_11: ; preds = %_llgo_10
%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 @3, ptr %95, align 8
%96 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %94, i32 0, i32 1
store i64 4, ptr %96, align 4
%97 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %94, align 8
%98 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %98, i32 0, i32 0
store ptr @8, ptr %99, align 8
%100 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %98, i32 0, i32 1
store i64 1, ptr %100, align 4
%101 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %98, align 8
call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %19, %"github.com/goplus/llgo/internal/runtime.String" %97, %"github.com/goplus/llgo/internal/runtime.String" %101, ptr %93, { ptr, i64, i64 } zeroinitializer, { ptr, i64, i64 } zeroinitializer)
br label %_llgo_12
_llgo_12: ; preds = %_llgo_11, %_llgo_10
%102 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 0, i64 0, i64 0)
%103 = load ptr, ptr @_llgo_main.N, align 8
%104 = icmp eq ptr %103, null
br i1 %104, label %_llgo_13, label %_llgo_14
_llgo_13: ; preds = %_llgo_12
store ptr %102, ptr @_llgo_main.N, align 8
br label %_llgo_14
_llgo_14: ; preds = %_llgo_13, %_llgo_12
%105 = load ptr, ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", align 8
br i1 %104, label %_llgo_15, label %_llgo_16
_llgo_15: ; preds = %_llgo_14
%106 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%107 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %106, i32 0, i32 0
store ptr @3, ptr %107, align 8
%108 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %106, i32 0, i32 1
store i64 4, ptr %108, align 4
%109 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %106, align 8
%110 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%111 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %110, i32 0, i32 0
store ptr @9, ptr %111, align 8
%112 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %110, i32 0, i32 1
store i64 1, ptr %112, align 4
%113 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %110, align 8
call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %102, %"github.com/goplus/llgo/internal/runtime.String" %109, %"github.com/goplus/llgo/internal/runtime.String" %113, ptr %105, { ptr, i64, i64 } zeroinitializer, { ptr, i64, i64 } zeroinitializer)
br label %_llgo_16
_llgo_16: ; preds = %_llgo_15, %_llgo_14
%114 = load ptr, ptr @"map[_llgo_int]_llgo_string", align 8
%115 = icmp eq ptr %114, null
br i1 %115, label %_llgo_17, label %_llgo_18
_llgo_17: ; preds = %_llgo_16
%116 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 34)
%117 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
%118 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%119 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %118, i32 0, i32 0
store ptr @10, ptr %119, align 8
%120 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %118, i32 0, i32 1
store i64 7, ptr %120, align 4
%121 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %118, align 8
%122 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%123 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %122, i32 0, i32 0
store ptr null, ptr %123, align 8
%124 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %122, i32 0, i32 1
store i64 0, ptr %124, align 4
%125 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %122, align 8
%126 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 40)
%127 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 8, ptr %126)
%128 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %121, ptr %127, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %125, i1 false)
%129 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%130 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %129, i32 0, i32 0
store ptr @11, ptr %130, align 8
%131 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %129, i32 0, i32 1
store i64 4, ptr %131, align 4
%132 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %129, align 8
%133 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %133, i32 0, i32 0
store ptr null, ptr %134, align 8
%135 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %133, i32 0, i32 1
store i64 0, ptr %135, align 4
%136 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %133, align 8
%137 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 34)
%138 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 8, ptr %137)
%139 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %132, ptr %138, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %136, i1 false)
%140 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%141 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %140, i32 0, i32 0
store ptr @12, ptr %141, align 8
%142 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %140, i32 0, i32 1
store i64 5, ptr %142, align 4
%143 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %140, align 8
%144 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%145 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %144, i32 0, i32 0
store ptr null, ptr %145, align 8
%146 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %144, i32 0, i32 1
store i64 0, ptr %146, align 4
%147 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %144, align 8
%148 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
%149 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 8, ptr %148)
%150 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %143, ptr %149, i64 72, %"github.com/goplus/llgo/internal/runtime.String" %147, i1 false)
%151 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%152 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %151, i32 0, i32 0
store ptr @13, ptr %152, align 8
%153 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %151, i32 0, i32 1
store i64 8, ptr %153, align 4
%154 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %151, align 8
%155 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%156 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %155, i32 0, i32 0
store ptr null, ptr %156, align 8
%157 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %155, i32 0, i32 1
store i64 0, ptr %157, align 4
%158 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %155, align 8
%159 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 58)
%160 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %154, ptr %159, i64 200, %"github.com/goplus/llgo/internal/runtime.String" %158, i1 false)
%161 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%162 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %161, i32 0, i32 0
store ptr @3, ptr %162, align 8
%163 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %161, i32 0, i32 1
store i64 4, ptr %163, align 4
%164 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %161, align 8
%165 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 224)
%166 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %165, i64 0
store %"github.com/goplus/llgo/internal/abi.StructField" %128, ptr %166, align 8
%167 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %165, i64 1
store %"github.com/goplus/llgo/internal/abi.StructField" %139, ptr %167, align 8
%168 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %165, i64 2
store %"github.com/goplus/llgo/internal/abi.StructField" %150, ptr %168, align 8
%169 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %165, i64 3
store %"github.com/goplus/llgo/internal/abi.StructField" %160, ptr %169, align 8
%170 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%171 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %170, i32 0, i32 0
store ptr %165, ptr %171, align 8
%172 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %170, i32 0, i32 1
store i64 4, ptr %172, align 4
%173 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %170, i32 0, i32 2
store i64 4, ptr %173, align 4
%174 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %170, align 8
%175 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %164, i64 208, %"github.com/goplus/llgo/internal/runtime.Slice" %174)
%176 = call ptr @"github.com/goplus/llgo/internal/runtime.MapOf"(ptr %116, ptr %117, ptr %175, i64 4)
call void @"github.com/goplus/llgo/internal/runtime.SetDirectIface"(ptr %176)
store ptr %176, ptr @"map[_llgo_int]_llgo_string", align 8
br label %_llgo_18
_llgo_18: ; preds = %_llgo_17, %_llgo_16
ret void
}
declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64)
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
declare void @"github.com/goplus/llgo/internal/runtime.Panic"(%"github.com/goplus/llgo/internal/runtime.eface")
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64)
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)
declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64)
declare i1 @"github.com/goplus/llgo/internal/runtime.StringEqual"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String")
declare i1 @"github.com/goplus/llgo/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/internal/runtime.eface", %"github.com/goplus/llgo/internal/runtime.eface")
declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, 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.NewNamed"(i64, i64, i64, i64)
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 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.NewChan"(i64, i64)
declare ptr @"github.com/goplus/llgo/internal/runtime.MapOf"(ptr, ptr, ptr, i64)
declare ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64, ptr)
declare void @"github.com/goplus/llgo/internal/runtime.SetDirectIface"(ptr)
declare ptr @"github.com/goplus/llgo/internal/runtime.MakeMap"(ptr, i64)
declare void @"github.com/goplus/llgo/internal/runtime.init"()

View File

@@ -1,303 +0,0 @@
; 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 i1 false, align 1
@_llgo_main.errorString = linkonce global ptr null, align 8
@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = linkonce global ptr null, align 8
@0 = private unnamed_addr constant [1 x i8] c"s", align 1
@1 = private unnamed_addr constant [4 x i8] c"main", align 1
@2 = private unnamed_addr constant [5 x i8] c"Error", align 1
@"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null, align 8
@_llgo_string = linkonce global ptr null, align 8
@3 = private unnamed_addr constant [11 x i8] c"errorString", align 1
@"*_llgo_main.errorString" = linkonce global ptr null, align 8
@"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = linkonce global ptr null, align 8
@__llgo_argc = global i32 0, align 4
@__llgo_argv = global ptr null, align 8
@4 = private unnamed_addr constant [8 x i8] c"an error", 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$after"()
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 @4, 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 = call ptr @"github.com/goplus/llgo/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/internal/runtime.iface" %6)
%8 = extractvalue %"github.com/goplus/llgo/internal/runtime.iface" %6, 0
%9 = getelementptr ptr, ptr %8, i64 3
%10 = load ptr, ptr %9, align 8
%11 = alloca { ptr, ptr }, align 8
%12 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 0
store ptr %10, ptr %12, align 8
%13 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1
store ptr %7, 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$after"() {
_llgo_0:
%0 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 16, i64 0, i64 1)
store ptr %0, ptr @_llgo_main.errorString, align 8
%1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0
store ptr @0, ptr %2, align 8
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1
store i64 1, ptr %3, align 4
%4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, 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 null, ptr %6, align 8
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1
store i64 0, ptr %7, align 4
%8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8
%9 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
%10 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %4, ptr %9, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %8, i1 false)
%11 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i32 0, i32 0
store ptr @1, ptr %12, align 8
%13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i32 0, i32 1
store i64 4, ptr %13, align 4
%14 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %11, align 8
%15 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56)
%16 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %15, i64 0
store %"github.com/goplus/llgo/internal/abi.StructField" %10, ptr %16, align 8
%17 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 0
store ptr %15, ptr %18, align 8
%19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 1
store i64 1, ptr %19, align 4
%20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 2
store i64 1, ptr %20, align 4
%21 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, align 8
%22 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %14, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %21)
store ptr %22, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8
%23 = load ptr, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8
%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 5, ptr %26, align 4
%27 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %24, align 8
%28 = load ptr, ptr @_llgo_string, align 8
%29 = icmp eq ptr %28, null
br i1 %29, label %_llgo_1, label %_llgo_2
_llgo_1: ; preds = %_llgo_0
%30 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24)
store ptr %30, ptr @_llgo_string, align 8
br label %_llgo_2
_llgo_2: ; preds = %_llgo_1, %_llgo_0
%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)
call void @"github.com/goplus/llgo/internal/runtime.SetDirectIface"(ptr %47)
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" %27, 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 @1, 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 @3, ptr %67, align 8
%68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 1
store i64 11, 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 %23, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %61)
%70 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %0)
call void @"github.com/goplus/llgo/internal/runtime.SetDirectIface"(ptr %70)
store ptr %70, ptr @"*_llgo_main.errorString", align 8
%71 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8
%72 = load ptr, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8
%73 = icmp eq ptr %72, null
br i1 %73, label %_llgo_5, label %_llgo_6
_llgo_5: ; preds = %_llgo_4
%74 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%75 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %74, i32 0, i32 0
store ptr @2, ptr %75, align 8
%76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %74, i32 0, i32 1
store i64 5, ptr %76, align 4
%77 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %74, align 8
%78 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8
%79 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %78, i32 0, i32 0
store %"github.com/goplus/llgo/internal/runtime.String" %77, ptr %79, align 8
%80 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %78, i32 0, i32 1
store ptr %71, ptr %80, align 8
%81 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %78, align 8
%82 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24)
%83 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %82, i64 0
store %"github.com/goplus/llgo/internal/abi.Imethod" %81, ptr %83, align 8
%84 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8
%85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %84, i32 0, i32 0
store ptr %82, ptr %85, align 8
%86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %84, i32 0, i32 1
store i64 1, ptr %86, align 4
%87 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %84, i32 0, i32 2
store i64 1, ptr %87, align 4
%88 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %84, 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 @1, 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 null, ptr %94, align 8
%95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 1
store i64 0, ptr %95, align 4
%96 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %93, align 8
%97 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %92, %"github.com/goplus/llgo/internal/runtime.String" %96, %"github.com/goplus/llgo/internal/runtime.Slice" %88)
store ptr %97, 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, 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.Basic"(i64)
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 void @"github.com/goplus/llgo/internal/runtime.SetDirectIface"(ptr)
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 ptr @"github.com/goplus/llgo/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/internal/runtime.iface")
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")

View File

@@ -1,124 +0,0 @@
; ModuleID = 'main'
source_filename = "main"
%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 }
%"github.com/goplus/llgo/c/pthread.RoutineFunc" = type { ptr, ptr }
@"main.init$guard" = global i1 false, align 1
@__llgo_argc = global i32 0, align 4
@__llgo_argv = global ptr null, align 8
@0 = private unnamed_addr constant [16 x i8] c"Hello, goroutine", align 1
@1 = private unnamed_addr constant [1 x i8] c".", 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()
%2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 1)
store i1 false, ptr %2, align 1
%3 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8)
%4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0
store ptr %2, ptr %4, align 8
%5 = alloca { ptr, ptr }, align 8
%6 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0
store ptr @"main.main$1", ptr %6, align 8
%7 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
store ptr %3, ptr %7, align 8
%8 = load { ptr, ptr }, 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 @0, ptr %10, align 8
%11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1
store i64 16, ptr %11, align 4
%12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8
%13 = call ptr @malloc(i64 32)
%14 = getelementptr inbounds { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %13, i32 0, i32 0
store { ptr, ptr } %8, ptr %14, align 8
%15 = getelementptr inbounds { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %13, i32 0, i32 1
store %"github.com/goplus/llgo/internal/runtime.String" %12, ptr %15, align 8
%16 = alloca i8, i64 8, align 1
%17 = alloca %"github.com/goplus/llgo/c/pthread.RoutineFunc", align 8
%18 = getelementptr inbounds %"github.com/goplus/llgo/c/pthread.RoutineFunc", ptr %17, i32 0, i32 0
store ptr @"__llgo_stub.main._llgo_routine$1", ptr %18, align 8
%19 = getelementptr inbounds %"github.com/goplus/llgo/c/pthread.RoutineFunc", ptr %17, i32 0, i32 1
store ptr null, ptr %19, align 8
%20 = load %"github.com/goplus/llgo/c/pthread.RoutineFunc", ptr %17, align 8
%21 = call i32 @"github.com/goplus/llgo/internal/runtime.CreateThread"(ptr %16, ptr null, %"github.com/goplus/llgo/c/pthread.RoutineFunc" %20, ptr %13)
br label %_llgo_3
_llgo_1: ; preds = %_llgo_3
%22 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 0
store ptr @1, ptr %23, align 8
%24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 1
store i64 1, ptr %24, align 4
%25 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %22, align 8
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %25)
br label %_llgo_3
_llgo_2: ; preds = %_llgo_3
ret i32 0
_llgo_3: ; preds = %_llgo_1, %_llgo_0
%26 = load i1, ptr %2, align 1
br i1 %26, label %_llgo_2, label %_llgo_1
}
define void @"main.main$1"(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)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
%2 = load { ptr }, ptr %0, align 8
%3 = extractvalue { ptr } %2, 0
store i1 true, ptr %3, align 1
ret void
}
declare void @"github.com/goplus/llgo/internal/runtime.init"()
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64)
declare ptr @malloc(i64)
define ptr @"main._llgo_routine$1"(ptr %0) {
_llgo_0:
%1 = load { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %0, align 8
%2 = extractvalue { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" } %1, 0
%3 = extractvalue { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" } %1, 1
%4 = extractvalue { ptr, ptr } %2, 1
%5 = extractvalue { ptr, ptr } %2, 0
call void %5(ptr %4, %"github.com/goplus/llgo/internal/runtime.String" %3)
call void @free(ptr %0)
ret ptr null
}
declare void @free(ptr)
declare i32 @"github.com/goplus/llgo/internal/runtime.CreateThread"(ptr, ptr, %"github.com/goplus/llgo/c/pthread.RoutineFunc", ptr)
define linkonce ptr @"__llgo_stub.main._llgo_routine$1"(ptr %0, ptr %1) {
_llgo_0:
%2 = tail call ptr @"main._llgo_routine$1"(ptr %1)
ret ptr %2
}
declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String")
declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8)

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More