Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Llvm mos #4051

Open
wants to merge 6 commits into
base: release
Choose a base branch
from
Open

WIP: Llvm mos #4051

wants to merge 6 commits into from

Conversation

danacr
Copy link

@danacr danacr commented Dec 20, 2023

current issue:

❯ make
CGO_CPPFLAGS="-I/Users/danacristinii/Dev/tinygo/llvm-project/llvm/include -I/Users/danacristinii/Dev/tinygo/llvm-build/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/Users/danacristinii/Dev/tinygo/llvm-build/tools/clang/include -I/Users/danacristinii/Dev/tinygo/llvm-project/clang/include -I/Users/danacristinii/Dev/tinygo/llvm-project/lld/include" CGO_CXXFLAGS="-std=c++17" CGO_LDFLAGS="-lxar -L/Users/danacristinii/Dev/tinygo/llvm-build/lib -lclang  -lclangAnalysis -lclangAST -lclangASTMatchers -lclangBasic -lclangCodeGen -lclangCrossTU -lclangDriver -lclangDynamicASTMatchers -lclangEdit -lclangExtractAPI -lclangFormat -lclangFrontend -lclangFrontendTool -lclangHandleCXX -lclangHandleLLVM -lclangIndex -lclangLex -lclangParse -lclangRewrite -lclangRewriteFrontend -lclangSema -lclangSerialization -lclangSupport -lclangTooling -lclangToolingASTDiff -lclangToolingCore -lclangToolingInclusions  -lstdc++  -llldCOFF -llldCommon -llldELF -llldMachO -llldMinGW -llldWasm  -L/Users/danacristinii/Dev/tinygo/llvm-build/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVMWindowsManifest -lLLVMWindowsDriver -lLLVMMCJIT -lLLVMLibDriver -lLLVMOption -lLLVMInterpreter -lLLVMFrontendHLSL -lLLVMExecutionEngine -lLLVMRuntimeDyld -lLLVMOrcTargetProcess -lLLVMOrcShared -lLLVMCoverage -lLLVMMOSDisassembler -lLLVMMOSAsmParser -lLLVMMOSCodeGen -lLLVMMOSDesc -lLLVMMOSInfo -lLLVMLTO -lLLVMPasses -lLLVMIRPrinter -lLLVMHipStdPar -lLLVMCoroutines -lLLVMExtensions -lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyAsmParser -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyUtils -lLLVMWebAssemblyDesc -lLLVMWebAssemblyInfo -lLLVMRISCVTargetMCA -lLLVMRISCVDisassembler -lLLVMRISCVAsmParser -lLLVMRISCVCodeGen -lLLVMRISCVDesc -lLLVMRISCVInfo -lLLVMAArch64Disassembler -lLLVMAArch64AsmParser -lLLVMAArch64CodeGen -lLLVMAArch64Desc -lLLVMAArch64Utils -lLLVMAArch64Info -lLLVMARMDisassembler -lLLVMARMAsmParser -lLLVMARMCodeGen -lLLVMipo -lLLVMVectorize -lLLVMLinker -lLLVMFrontendOpenMP -lLLVMFrontendOffloading -lLLVMARMDesc -lLLVMARMUtils -lLLVMARMInfo -lLLVMX86TargetMCA -lLLVMMCA -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info -lLLVMMCDisassembler -lLLVMInstrumentation -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMCFGuard -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMTarget -lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMObjCARCOpts -lLLVMTransformUtils -lLLVMCodeGenTypes -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMSymbolize -lLLVMDebugInfoBTF -lLLVMDebugInfoPDB -lLLVMDebugInfoMSF -lLLVMDebugInfoDWARF -lLLVMObject -lLLVMTextAPI -lLLVMMCParser -lLLVMIRReader -lLLVMAsmParser -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMBitReader -lLLVMCore -lLLVMRemarks -lLLVMBitstreamReader -lLLVMBinaryFormat -lLLVMTargetParser -lLLVMSupport -lLLVMDemangle -lm -lstdc++ "  go build -buildmode exe -o build/tinygo -tags "byollvm osusergo" -ldflags="-X github.com/tinygo-org/tinygo/goenv.GitSha1=`git rev-parse --short HEAD`" .
# tinygo.org/x/go-llvm
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:941:50: could not determine kind of name for C.LLVMConstAShr
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:926:52: could not determine kind of name for C.LLVMConstAnd
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:982:55: could not determine kind of name for C.LLVMConstFPCast
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:957:57: could not determine kind of name for C.LLVMConstFPExt
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:961:57: could not determine kind of name for C.LLVMConstFPToSI
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:960:57: could not determine kind of name for C.LLVMConstFPToUI
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:956:57: could not determine kind of name for C.LLVMConstFPTrunc
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:979:9: could not determine kind of name for C.LLVMConstIntCast
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:940:50: could not determine kind of name for C.LLVMConstLShr
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:927:52: could not determine kind of name for C.LLVMConstOr
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:954:57: could not determine kind of name for C.LLVMConstSExt
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:970:9: could not determine kind of name for C.LLVMConstSExtOrBitCast
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:959:57: could not determine kind of name for C.LLVMConstSIToFP
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:958:57: could not determine kind of name for C.LLVMConstUIToFP
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:955:57: could not determine kind of name for C.LLVMConstZExt
../go/pkg/mod/tinygo.org/x/go-llvm@v0.0.0-20231014233752-75a8a9fe6f74/ir.go:966:9: could not determine kind of name for C.LLVMConstZExtOrBitCast
make: *** [tinygo] Error 1

@danacr danacr changed the base branch from release to docker-llvm-17 December 20, 2023 14:37
@danacr danacr changed the title Llvm mos Draft: Llvm mos Dec 20, 2023
@danacr danacr changed the title Draft: Llvm mos WIP: Llvm mos Dec 20, 2023
@danacr
Copy link
Author

danacr commented Dec 20, 2023

Modifying the go-llvm package to not reference those variables https://github.com/danacr/go-llvm/pull/1/files:

replace tinygo.org/x/go-llvm => /Users/danacristinii/Dev/go-llvm

gets us to this:

# github.com/tinygo-org/tinygo/compiler
compiler/asserts.go:138:21: undefined: llvm.ConstLShr
compiler/asserts.go:153:21: undefined: llvm.ConstZExt
make: *** [tinygo] Error 1

I'm not sure this is good enough for the compiler

@aykevl
Copy link
Member

aykevl commented Dec 20, 2023

It appears that you're using a development branch of LLVM?
We only support one particular version of LLVM for statically linking, which at the moment is LLVM 16. We will hopefully get LLVM 17 soon once Espressif finally rebases their compiler. It's not just the go-llvm package that needs updates, there is also builder/clang.cpp which usually needs some changes (and various other places in the compiler).

If there is a LLVM 16 version of the MOS backend, I would suggest working with that.

@danacr danacr changed the base branch from docker-llvm-17 to release December 20, 2023 23:05
@danacr
Copy link
Author

danacr commented Dec 21, 2023

Thank you @aykevl for the awesome pointer!

After some digging, I found the commit that was llvm16 and had the mos architecture. Both the llvm build triggered using the tinygo Makefile and the tinygo build based on llvm-mos succeeded.

Currently working on hand-writing the svd for 6502, I got this far based on https://raw.githubusercontent.com/mlund/mos-hardware/main/src/c64.rs and chatgpt:

<?xml version="1.0" encoding="utf-8"?>
<device schemaVersion="1.1">
  <vendor>Commodore</vendor>
  <name>C64</name>

  <peripherals>
    <!-- CPU (MOS 6510) -->
    <peripheral>
      <name>CPU</name>
      <baseAddress>0x0001</baseAddress>
      <description>MOS 6510 Processor</description>
      <registers>
        <register>
          <name>CPU_PORT</name>
          <addressOffset>0x0001</addressOffset>
          <description>Control flags for the CPU port R6510</description>
          <size>8</size>
          <access>RW</access>
        </register>
      </registers>
    </peripheral>

    <!-- VIC-II (Video Interface Chip) -->
    <peripheral>
      <name>VIC-II</name>
      <baseAddress>0xD000</baseAddress>
      <description>Video Interface Chip</description>
      <registers>
        <register>
          <name>VIC</name>
          <addressOffset>0x0000</addressOffset>
          <description>Video Interface Controller</description>
          <size>8</size>
          <access>RW</access>
        </register>
      </registers>
    </peripheral>

    <!-- SID (Sound Interface Device) -->
    <peripheral>
      <name>SID</name>
      <baseAddress>0xD400</baseAddress>
      <description>Sound Interface Device</description>
      <registers>
        <register>
          <name>SID</name>
          <addressOffset>0x0000</addressOffset>
          <description>Sound Interface Device</description>
          <size>8</size>
          <access>RW</access>
        </register>
      </registers>
    </peripheral>

    <!-- CIA1 -->
    <peripheral>
      <name>CIA1</name>
      <baseAddress>0xDC00</baseAddress>
      <description>Complex Interface Adapter 1</description>
      <registers>
        <register>
          <name>CIA1ControlA</name>
          <addressOffset>0x0E</addressOffset>
          <description>Control A Register for CIA1</description>
          <size>8</size>
          <access>RW</access>
        </register>
      </registers>
    </peripheral>

    <!-- CIA2 -->
    <peripheral>
      <name>CIA2</name>
      <baseAddress>0xDD00</baseAddress>
      <description>Complex Interface Adapter 2</description>
    </peripheral>

    <!-- Memory Map -->
    <peripheral>
      <name>Memory</name>
      <baseAddress>0x0000</baseAddress>
      <description>Main Memory</description>
      <registers>
        <register>
          <name>DEFAULT_VIDEO_MEMORY</name>
          <addressOffset>0x0400</addressOffset>
          <description>Default Video Memory</description>
          <size>8</size>
          <access>RW</access>
        </register>
        <register>
          <name>COLOR_RAM</name>
          <addressOffset>0xD800</addressOffset>
          <description>Color RAM</description>
          <size>8</size>
          <access>RW</access>
        </register>
      </registers>
    </peripheral>

    <!-- Additional peripherals and their registers can be added here -->
  </peripherals>
</device>

@danacr
Copy link
Author

danacr commented Dec 21, 2023

currently I'm failing at building a simple print hello world application:

❯ ../tinygo/build/tinygo build  -target=6502 main.go
# internal/task
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:15:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:17:13: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:28:12: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:33:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:36:13: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:44:12: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:50:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:58:12: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:63:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:65:12: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:78:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:80:13: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:84:12: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:89:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:95:12: undefined: interrupt.Restore
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:115:17: undefined: interrupt.Disable
/Users/danacristinii/Dev/tinygo/src/internal/task/queue.go:122:12: undefined: interrupt.Restore

@aykevl do you happen to know what is the minimal thing that I should add to go further? I know my machine, runtime, and target are bad :)

@aykevl
Copy link
Member

aykevl commented Dec 21, 2023

If you hadn't seen already, this might be useful (though perhaps a bit outdated): https://github.com/tinygo-org/tinygo/wiki/Adding-a-new-board

Regarding the build issue you're running into: you need to add a way to disable and restore interrupts.
If you don't plan on adding interrupt support, you can just add dummy functions like here: https://github.com/tinygo-org/tinygo/blob/release/src/runtime/interrupt/interrupt_none.go
For real interrupt support, you can take a look at the AVR code for example: https://github.com/tinygo-org/tinygo/blob/release/src/runtime/interrupt/interrupt_avr.go

@danacr
Copy link
Author

danacr commented Dec 22, 2023

thank you so much @aykevl ! I've been trying to follow the guide, but adding a new architecture has not been straightforward :)

It looks like I have my work cut out for me:

❯ ../tinygo/build/tinygo build  -target=6502 main.go
# runtime
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:30:21: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:84:42: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/time.go:11:33: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/baremetal.go:59:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/baremetal.go:64:2: undefined: exit
/Users/danacristinii/Dev/tinygo/src/runtime/panic.go:52:2: undefined: abort
/Users/danacristinii/Dev/tinygo/src/runtime/panic.go:71:2: undefined: abort
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:14:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:26:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:35:4: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:69:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:90:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:96:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:184:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:264:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:269:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:276:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:283:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:288:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:290:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:336:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:338:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:340:3: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:351:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:359:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:360:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:364:4: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:366:4: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:381:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:383:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/print.go:385:2: undefined: putchar
/Users/danacristinii/Dev/tinygo/src/runtime/runtime.go:70:9: undefined: ticksToNanoseconds
/Users/danacristinii/Dev/tinygo/src/runtime/runtime.go:70:28: undefined: ticks
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:92:9: undefined: ticks
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:162:10: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:167:10: undefined: ticks
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:172:53: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:175:26: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:203:17: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:205:16: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:217:39: undefined: timeUnit
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler.go:223:4: undefined: sleepTicks
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler_none.go:11:2: undefined: sleepTicks
/Users/danacristinii/Dev/tinygo/src/runtime/scheduler_none.go:11:13: undefined: nanosecondsToTicks
/Users/danacristinii/Dev/tinygo/src/runtime/time.go:12:9: undefined: nanosecondsToTicks

I guess this is the bare minimum I need to support to get the print program to work

@danacr
Copy link
Author

danacr commented Dec 22, 2023

it now builds, but fails to link :) this is a bit tougher:

❯ ../tinygo/build/tinygo build -target=6502 main.go
tinygo:ld.lld: error: undefined symbol: __rc4
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced 67 more times

tinygo:ld.lld: error: undefined symbol: __rc5
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:35 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:35)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_store_2)
>>> referenced 43 more times

tinygo:ld.lld: error: undefined symbol: __rc3
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:35 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:35)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_store_2)
>>> referenced by atomics_critical.go:42 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:42)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced 24 more times

tinygo:ld.lld: error: undefined symbol: __rc2
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced by atomics_critical.go:27 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:27)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_load_2)
>>> referenced 160 more times

tinygo:ld.lld: error: undefined symbol: __rc6
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_store_2)
>>> referenced by atomics_critical.go:35 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:35)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_store_2)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced 46 more times

tinygo:ld.lld: error: undefined symbol: __rc7
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced by atomics_critical.go:43 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:43)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced by atomics_critical.go:57 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:57)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_compare_exchange_2)
>>> referenced 30 more times

tinygo:ld.lld: error: undefined symbol: __rc9
>>> referenced by atomics_critical.go:42 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:42)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced 13 more times

tinygo:ld.lld: error: undefined symbol: __rc8
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS16)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_compare_exchange_2)
>>> referenced 24 more times

tinygo:ld.lld: error: undefined symbol: __rc10
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_compare_exchange_4)
>>> referenced 16 more times

tinygo:ld.lld: error: undefined symbol: __rc11
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:132 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:132)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(__atomic_compare_exchange_4)
>>> referenced 14 more times

tinygo:ld.lld: error: undefined symbol: __rc12
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced 20 more times

tinygo:ld.lld: error: undefined symbol: __rc13
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced 5 more times

tinygo:ld.lld: error: undefined symbol: __rc14
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced 4 more times

tinygo:ld.lld: error: undefined symbol: __rc15
>>> referenced by atomics_critical.go:131 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:131)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS32)
>>> referenced 4 more times

tinygo:ld.lld: error: undefined symbol: __rc16
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced 9 more times

tinygo:ld.lld: error: undefined symbol: __rc20
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced 19 more times

tinygo:ld.lld: error: undefined symbol: __rc21
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced 12 more times

tinygo:ld.lld: error: undefined symbol: __rc22
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced 2 more times

tinygo:ld.lld: error: undefined symbol: __rc23
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced 2 more times

tinygo:ld.lld: error: undefined symbol: __rc24
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:220 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:220)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced by atomics_critical.go:0 (/Users/danacristinii/Dev/tinygo/src/runtime/atomics_critical.go:0)
>>>               /Users/danacristinii/Library/Caches/tinygo/thinlto/llvmcache-E8123ADB7ED4283A7ED80802A183CCC09DF85A56:(runtime.doAtomicCAS64)
>>> referenced 2 more times

tinygo:ld.lld: error: too many errors emitted, stopping now (use --error-limit=0 to see all errors)
failed to run tool: ld.lld
error: failed to link /var/folders/_j/3mkdqkjj3hscfyn2rvv6bss40000gn/T/tinygo3932693917/main: exit status 1
  ~/Dev/funwgo ❯         

@aykevl
Copy link
Member

aykevl commented Feb 25, 2024

What's this main.go file? I'm surprised you're running into atomics issues. I recommend starting out with a very minimal example, such as src/examples/serial.

@danacr
Copy link
Author

danacr commented Feb 25, 2024

hi @aykevl this is the main.go. I tried to not even use time:

package main

func main() {
	println("hello world")
}

@aykevl
Copy link
Member

aykevl commented Feb 25, 2024

Huh, weird. I wonder where those atomics are used?
In any case, these __rc4 etc functions are MOS specific, perhaps you can ask the people who work on llvm-mos what these are?

@danacr
Copy link
Author

danacr commented Feb 25, 2024

@aykevl would it be possible to specify a different binary to build to a specific target? Or can I create and export a build and then manually pass it to llvm? https://github.com/llvm-mos/llvm-mos-sdk?tab=readme-ov-file#compile-an-example

@danacr
Copy link
Author

danacr commented Feb 26, 2024

note, if I set opts=0 i get the following:

❯ ../tinygo/build/tinygo build -target=6502 -opt=0 main.go
LLVM ERROR: unable to legalize instruction: %1:_(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0 (in function: runtime.nilPanic)
error: failed to link /var/folders/_j/3mkdqkjj3hscfyn2rvv6bss40000gn/T/tinygo70872115/main: signal: abort trap
  ~/DEv/funwgo ❯

@aykevl
Copy link
Member

aykevl commented Feb 28, 2024

note, if I set opts=0 i get the following:

It's best not to use -opt=0. It might work in some cases, but there are a few things in the runtime that expect the optimizer to run (and in general you'll run more quickly into code that doesn't work yet, as you've seen).

@aykevl
Copy link
Member

aykevl commented Mar 16, 2024

would it be possible to specify a different binary to build to a specific target? Or can I create and export a build and then manually pass it to llvm?

You mean whether we can use an external Clang for linking?
The short answer is no. We did this in the past, and it led to numerous issues. For example in #3267 I dropped the avr-gcc dependency. The resulting simplicity in installing TinyGo was well worth the effort.
Since then, various parts of TinyGo have started to rely on the assumption that TinyGo controls the linking process (for example, by using ThinLTO).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants