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

nix: use LLVM 18 instead of LLVM 17 #4516

Merged
merged 1 commit into from
Oct 17, 2024
Merged

nix: use LLVM 18 instead of LLVM 17 #4516

merged 1 commit into from
Oct 17, 2024

Conversation

aykevl
Copy link
Member

@aykevl aykevl commented Oct 11, 2024

This should hopefully fix some CI issues we're currently having: #4515

Copy link

github-actions bot commented Oct 11, 2024

Size difference with the dev branch:

Binary size difference
 flash                          ram
 before   after   diff          before   after   diff
  16820   16820      0   0.00%    4324    4324      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-rp2040 ./examples/adafruit4650
  61224   61224      0   0.00%    6196    6196      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/adt7410/main.go
   9528    9528      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/adxl345/main.go
  13516   13516      0   0.00%    6796    6796      0   0.00% tinygo build -size short -o ./build/test.hex -target=pybadge ./examples/amg88xx
   8640    8640      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/apa102/main.go
  11712   11712      0   0.00%    6580    6580      0   0.00% tinygo build -size short -o ./build/test.hex -target=nano-33-ble ./examples/apds9960/proximity/main.go
   9756    9756      0   0.00%    4768    4768      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/apa102/itsybitsy-m0/main.go
   8332    8332      0   0.00%    2320    2320      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/at24cx/main.go
   8084    8084      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/bh1750/main.go
   7392    7392      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/blinkm/main.go
  70408   70408      0   0.00%    3660    3660      0   0.00% tinygo build -size short -o ./build/test.hex -target=pinetime     ./examples/bma42x/main.go
  63780   63780      0   0.00%    6196    6196      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/bmi160/main.go
  27380   27380      0   0.00%    4788    4788      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/bmp180/main.go
  63832   63832      0   0.00%    6228    6228      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/bmp280/main.go
  12144   12144      0   0.00%    4820    4820      0   0.00% tinygo build -size short -o ./build/test.hex -target=trinket-m0 ./examples/bmp388/main.go
   8164    8164      0   0.00%    3348    3348      0   0.00% tinygo build -size short -o ./build/test.hex -target=bluepill ./examples/ds1307/sram/main.go
  22084   22084      0   0.00%    3544    3544      0   0.00% tinygo build -size short -o ./build/test.hex -target=bluepill ./examples/ds1307/time/main.go
  69512   69512      0   0.00%    6376    6376      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/ds3231/main.go
   4580    4580      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/easystepper/main.go
  69104   69104      0   0.00%    6976    6976      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/flash/console/spi
  65492   65492      0   0.00%    9012    9012      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/flash/console/qspi
   7172    7172      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/gc9a01/main.go
  67484   67484      0   0.00%    6368    6368      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/gps/i2c/main.go
  68020   68020      0   0.00%    6504    6504      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/gps/uart/main.go
   7832    7832      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/hcsr04/main.go
   5792    5792      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/hd44780/customchar/main.go
   5744    5744      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/hd44780/text/main.go
  10472   10472      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/hd44780i2c/main.go
  14640   14640      0   0.00%    6580    6580      0   0.00% tinygo build -size short -o ./build/test.hex -target=nano-33-ble ./examples/hts221/main.go
  16108   16108      0   0.00%    2360    2360      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/hub75/main.go
  10116   10116      0   0.00%    6916    6916      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/ili9341/basic
  10604   10604      0   0.00%    4868    4868      0   0.00% tinygo build -size short -o ./build/test.hex -target=xiao ./examples/ili9341/basic
  29476   29476      0   0.00%   38076   38076      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/ili9341/pyportal_boing
  10136   10136      0   0.00%    6924    6924      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/ili9341/scroll
  10692   10692      0   0.00%    4876    4876      0   0.00% tinygo build -size short -o ./build/test.hex -target=xiao ./examples/ili9341/scroll
 263452  263452      0   0.00%   46760   46760      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/ili9341/slideshow
  11692   11692      0   0.00%    4788    4788      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/lis3dh/main.go
  13984   13984      0   0.00%    6580    6580      0   0.00% tinygo build -size short -o ./build/test.hex -target=nano-33-ble ./examples/lps22hb/main.go
  26092   26092      0   0.00%    2328    2328      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/lsm303agr/main.go
  12408   12408      0   0.00%    4796    4796      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/lsm6ds3/main.go
  10704   10704      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mag3110/main.go
   9880    9880      0   0.00%    4780    4780      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mcp23017/main.go
  10316   10316      0   0.00%    4788    4788      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mcp23017-multiple/main.go
   9740    9740      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mcp3008/main.go
  68408   68408      0   0.00%    6196    6196      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mcp2515/main.go
  27180   27180      0   0.00%    3648    3648      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/microbitmatrix/main.go
  26924   26924      0   0.00%    5696    5696      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit-v2 ./examples/microbitmatrix/main.go
   8200    8200      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mma8653/main.go
   8108    8108      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mpu6050/main.go
  75688   75688      0   0.00%    7480    7480      0   0.00% tinygo build -size short -o ./build/test.hex -target=p1am-100 ./examples/p1am/main.go
  12212   12212      0   0.00%    3352    3352      0   0.00% tinygo build -size short -o ./build/test.hex -target=pico ./examples/pca9685/main.go
   6188    6188      0   0.00%    3288    3288      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/pcd8544/setbuffer/main.go
   5220    5220      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/pcd8544/setpixel/main.go
  10488   10488      0   0.00%    3328    3328      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-rp2040 ./examples/seesaw
   2825    2825      0   0.00%     558     558      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino ./examples/servo
  13728   13728      0   0.00%    3400    3400      0   0.00% tinygo build -size short -o ./build/test.hex -target=pico     ./examples/sgp30
   8044    8044      0   0.00%    6796    6796      0   0.00% tinygo build -size short -o ./build/test.hex -target=pybadge ./examples/shifter/main.go
  57220   57220      0   0.00%    3692    3692      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/sht3x/main.go
  57276   57276      0   0.00%    3700    3700      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/sht4x/main.go
  57184   57184      0   0.00%    3692    3692      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/shtc3/main.go
   6612    6612      0   0.00%    2288    2288      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/ssd1306/i2c_128x32/main.go
   6060    6060      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/ssd1306/spi_128x64/main.go
   5808    5808      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/ssd1331/main.go
   6736    6736      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/st7735/main.go
   6648    6648      0   0.00%    2280    2280      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/st7789/main.go
  16924   16924      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/thermistor/main.go
  10440   10440      0   0.00%    4540    4540      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-bluefruit ./examples/tone
  10028   10028      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/tm1637/main.go
   9492    9492      0   0.00%    6788    6788      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/touch/resistive/fourwire/main.go
  12560   12560      0   0.00%    6984    6984      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/touch/resistive/pyportal_touchpaint/main.go
  14956   14956      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/vl53l1x/main.go
  13432   13432      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/vl6180x/main.go
   6452    6452      0   0.00%    2320    2320      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd2in13/main.go
   6140    6140      0   0.00%    2312    2312      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd2in13x/main.go
   6364    6364      0   0.00%    2320    2320      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd4in2/main.go
  26408   26408      0   0.00%   16732   16732      0   0.00% tinygo build -size short -o ./build/test.hex -target=pico ./examples/waveshare-epd/epd2in66b/main.go
   6808    6808      0   0.00%    4788    4788      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/ws2812
   5738    5738      0   0.00%    9538    9538      0   0.00% tinygo build -size short -o ./build/test.bin -target=m5stamp-c3          ./examples/ws2812
  62244   62244      0   0.00%    5952    5952      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-nrf52840 ./examples/is31fl3731/main.go
   1581    1581      0   0.00%     598     598      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino   ./examples/ws2812
   1056    1056      0   0.00%     180     180      0   0.00% tinygo build -size short -o ./build/test.hex -target=digispark ./examples/ws2812
  31816   31816      0   0.00%    4788    4788      0   0.00% tinygo build -size short -o ./build/test.hex -target=trinket-m0 ./examples/bme280/main.go
  16412   16412      0   0.00%    4732    4732      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/microphone/main.go
  11052   11052      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/buzzer/main.go
  12760   12760      0   0.00%    4788    4788      0   0.00% tinygo build -size short -o ./build/test.hex -target=trinket-m0 ./examples/veml6070/main.go
   6724    6724      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/l293x/simple/main.go
   8636    8636      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/l293x/speed/main.go
   6692    6692      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/l9110x/simple/main.go
   9244    9244      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/l9110x/speed/main.go
   7296    7296      0   0.00%    3320    3320      0   0.00% tinygo build -size short -o ./build/test.hex -target=nucleo-f103rb ./examples/shiftregister/main.go
   6980    6980      0   0.00%    2268    2268      0   0.00% tinygo build -size short -o ./build/test.hex -target=hifive1b ./examples/ssd1351/main.go
  12964   12964      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/lis2mdl/main.go
   8840    8840      0   0.00%    4764    4764      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/max72xx/main.go
  77092   77092      0   0.00%    6344    6344      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/dht/main.go
  36484   36484      0   0.00%    3988    3988      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-rp2040 ./examples/pcf8523/
  71120   71120      0   0.00%    6344    6344      0   0.00% tinygo build -size short -o ./build/test.hex -target=xiao ./examples/pcf8563/alarm/
   7236    7236      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=xiao ./examples/pcf8563/clkout/
  70656   70656      0   0.00%    6340    6340      0   0.00% tinygo build -size short -o ./build/test.hex -target=xiao ./examples/pcf8563/time/
  71080   71080      0   0.00%    6352    6352      0   0.00% tinygo build -size short -o ./build/test.hex -target=xiao ./examples/pcf8563/timer/
  12148   12148      0   0.00%    3304    3304      0   0.00% tinygo build -size short -o ./build/test.hex -target=pico ./examples/qmi8658c/main.go
   8716    8716      0   0.00%    4756    4756      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/ina260/main.go
   9296    9296      0   0.00%    5260    5260      0   0.00% tinygo build -size short -o ./build/test.hex -target=nucleo-l432kc ./examples/aht20/main.go
  72580   72580      0   0.00%   10748   10748      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-m4 ./examples/sdcard/console/
  61320   61320      0   0.00%    8232    8232      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-m4 ./examples/i2csoft/adt7410/
  10260   10260      0   0.00%    6796    6796      0   0.00% tinygo build -size short -o ./build/test.elf -target=wioterminal ./examples/axp192/m5stack-core2-blinky/
   8996    8996      0   0.00%    3276    3276      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/xpt2046/main.go
  13708   13708      0   0.00%    4940    4940      0   0.00% tinygo build -size short -o ./build/test.hex -target=nucleo-wl55jc ./examples/sx126x/lora_rxtx/
  31288   31288      0   0.00%    4548    4548      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/ssd1289/main.go
  11224   11224      0   0.00%    4252    4252      0   0.00% tinygo build -size short -o ./build/test.hex -target=pico ./examples/irremote/main.go
  11872   11872      0   0.00%    3324    3324      0   0.00% tinygo build -size short -o ./build/test.hex -target=badger2040 ./examples/uc8151/main.go
  10388   10388      0   0.00%    3356    3356      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/scd4x/main.go
   8512    8512      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=circuitplay-express ./examples/makeybutton/main.go
   9508    9508      0   0.00%    4764    4764      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/ds18b20/main.go
  82976   82976      0   0.00%    6588    6588      0   0.00% tinygo build -size short -o ./build/test.hex -target=nucleo-wl55jc ./examples/lora/lorawan/atcmd/
  15884   15884      0   0.00%    4880    4880      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/as560x/main.go
   9856    9856      0   0.00%    3296    3296      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/mpu6886/main.go
   7768    7768      0   0.00%    4748    4748      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/ttp229/main.go
  66648   66648      0   0.00%    4816    4816      0   0.00% tinygo build -size short -o ./build/test.hex -target=pico ./examples/ndir/main_ndir.go
  62076   62076      0   0.00%    3788    3788      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/ndir/main_ndir.go
  65068   65068      0   0.00%    6260    6260      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 ./examples/ndir/main_ndir.go
   9284    9284      0   0.00%    3288    3288      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/mpu9150/main.go
  11364   11364      0   0.00%    3324    3324      0   0.00% tinygo build -size short -o ./build/test.hex -target=macropad-rp2040 ./examples/sh1106/macropad_spi
   8424    8424      0   0.00%    3760    3760      0   0.00% tinygo build -size short -o ./build/test.hex -target=macropad-rp2040 ./examples/encoders/quadrature-interrupt
  65632   65632      0   0.00%    4784    4784      0   0.00% tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/mcp9808/main.go
  85860   85860      0   0.00%    5140    5140      0   0.00% tinygo build -size short -o ./build/test.hex -target=challenger-rp2040 ./examples/net/ntpclient/
 295052  295052      0   0.00%   12760   12760      0   0.00% tinygo build -size short -o ./build/test.hex -target=pyportal -stack-size 8kb ./examples/net/http-get/
 119240  119240      0   0.00%    7848    7848      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-nano33 -stack-size 8kb ./examples/net/tcpclient/
 244184  244184      0   0.00%    9516    9516      0   0.00% tinygo build -size short -o ./build/test.hex -target=nano-rp2040 -stack-size 8kb ./examples/net/websocket/dial/
 103368  103368      0   0.00%    9832    9832      0   0.00% tinygo build -size short -o ./build/test.hex -target=metro-m4-airlift -stack-size 8kb ./examples/net/socket/
 336920  336920      0   0.00%   15748   15748      0   0.00% tinygo build -size short -o ./build/test.hex -target=matrixportal-m4 -stack-size 8kb ./examples/net/webstatic/
 111444  111444      0   0.00%    7772    7772      0   0.00% tinygo build -size short -o ./build/test.hex -target=arduino-mkrwifi1010 -stack-size 8kb ./examples/net/tlsclient/
 154088  154088      0   0.00%    6540    6540      0   0.00% tinygo build -size short -o ./build/test.hex -target=nano-rp2040 -stack-size 8kb ./examples/net/mqttclient/natiu/
 116948  116948      0   0.00%   13132   13132      0   0.00% tinygo build -size short -o ./build/test.hex -target=wioterminal -stack-size 8kb ./examples/net/webclient/
 284640  284640      0   0.00%   18172   18172      0   0.00% tinygo build -size short -o ./build/test.hex -target=wioterminal -stack-size 8kb ./examples/net/webserver/
 285736  285736      0   0.00%   17240   17240      0   0.00% tinygo build -size short -o ./build/test.hex -target=wioterminal -stack-size 8kb ./examples/net/mqttclient/paho/
5256780 5256780      0   0.00%  784230  784230      0   0.00%

Copy link
Contributor

@leongross leongross left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not know a lot about Nix, but if we do changes in the flake, don't we also have to update the flake.lock?

@aykevl
Copy link
Member Author

aykevl commented Oct 11, 2024

Yes, apparently! I ran nix develop locally and it automatically updated flake.lock.

@aykevl
Copy link
Member Author

aykevl commented Oct 12, 2024

It's still failing, and I don't know why because it works fine on my system:

/home/runner/go/bin/tinygo: symbol lookup error: /home/runner/go/bin/tinygo: undefined symbol: LLVMInitializeXtensaTarget, version LLVM_18.1

@leongross
Copy link
Contributor

Here also the linux wasm tests seem to fail, this has been observed in many recent PRs.

@deadprogram
Copy link
Member

/home/runner/go/bin/tinygo: symbol lookup error: /home/runner/go/bin/tinygo: undefined symbol: LLVMInitializeXtensaTarget, version LLVM_18.1

Any nix experts able to help out, please?

@sylv-io
Copy link

sylv-io commented Oct 15, 2024

I have tried your PR and have not been able to reproduce the symbol lookup error in the workflow either locally or with act -w nix-test. Can you re-run the workflow and see if the error persists?

@deadprogram
Copy link
Member

I just retried the workflow and same error @sylv-io

@leongross
Copy link
Contributor

@katexochen do you know what is going on here?

@sylv-io
Copy link

sylv-io commented Oct 15, 2024

A rather strange bug indeed. I was able to reproduce this bug and access the binary by forking tinygo and modifying the workflow.

Comparing the resulting binary with ghidra and ghidriff shows that the binary built by nix within the github runner adds support for two additional LLVM targets: M68k and Xtensa.

Here is a decompiler diff:

 void _cgo_ec38bf0848b9_Cfunc_LLVMInitializeAllTargets(void)
 
 {
   LLVMInitializeAArch64Target();
   LLVMInitializeAMDGPUTarget();
   LLVMInitializeARMTarget();
   LLVMInitializeAVRTarget();
   LLVMInitializeBPFTarget();
   LLVMInitializeHexagonTarget();
   LLVMInitializeLanaiTarget();
   LLVMInitializeLoongArchTarget();
   LLVMInitializeMipsTarget();
   LLVMInitializeMSP430Target();
   LLVMInitializeNVPTXTarget();
   LLVMInitializePowerPCTarget();
   LLVMInitializeRISCVTarget();
   LLVMInitializeSparcTarget();
   LLVMInitializeSystemZTarget();
   LLVMInitializeVETarget();
   LLVMInitializeWebAssemblyTarget();
   LLVMInitializeX86Target();
   LLVMInitializeXCoreTarget();
+  LLVMInitializeM68kTarget();
+  LLVMInitializeXtensaTarget();
   return;
 }

IIUC the Xtensa target is not supported by default in libLLVM, causing the runtime symbol lookup error. I cannot explain why this only happens in the GitHub runner, but perhaps this information can help you further.

Here is the full ghidriff report:
tinygo.local-tinygo.github.ghidriff.md

@sylv-io
Copy link

sylv-io commented Oct 16, 2024

@aykevl:

Okay, I understand the problem. tinygo is built using the system llvm headers, but links to the dynamic library provided by nix.

diff /nix/store/8bbp6b9wb0lc4kiv7a6qrljsp8mbp4lf-llvm-18.1.8-dev/include/llvm/Config/Targets.def /usr/include/llvm-18/llvm/Config/Targets.def

44a45,46
> LLVM_TARGET(M68k)
> LLVM_TARGET(Xtensa)

Removing the llvm system packages fixes the workflow, but this behavior is unintended and we should probably find out why the build is not using the nix header instead.

Here the workaround:
Commit: 9elements@5311787
Workflow: https://github.com/9elements/tinygo/actions/runs/11363440497

@sylv-io
Copy link

sylv-io commented Oct 16, 2024

In other words, we should fix the flake to use/prioritize the nix header instead. 👍

@sylv-io
Copy link

sylv-io commented Oct 16, 2024

By patching Target.def with an error macro, we can see that go-llvm is accessing the system headers: https://github.com/9elements/tinygo/actions/runs/11364600184/job/31610962741

I assume this is due to the hardcoded cgo flags in llvm_config_linux_llvm18.go: https://github.com/tinygo-org/go-llvm/blob/master/llvm_config_linux_llvm18.go#L5

This should fix some CI issues we're currently having.

Thanks to @sylv-io for discovering that we need to remove LLVM to avoid
an Xtensa backend linker error.
@aykevl
Copy link
Member Author

aykevl commented Oct 16, 2024

@sylv-io thank you! That is indeed a workaround (CI passes now!)

I'm not sure how this should ideally be fixed: ideally we'd want to keep go install working without any special flags. One option would be to use -idirafter to add the include directory after all the other directories, so that the Nix LLVM headers get searched first (hopefully!).

@sylv-io
Copy link

sylv-io commented Oct 16, 2024

@sylv-io thank you! That is indeed a workaround (CI passes now!)

np 😁

I'm not sure how this should ideally be fixed: ideally we'd want to keep go install working without any special flags. One option would be to use -idirafter to add the include directory after all the other directories, so that the Nix LLVM headers get searched first (hopefully!).

Yes, it looks like a difficult problem that probably needs to be addressed in go-llvm. Even if we define the correct CGO_CPPFLAGS in the flake shellHooks, the cgo flag CPPFLAGS in llvm_config_linux_llvm18.go seems to take precedence...

e.g.

export CGO_CPPFLAGS="-I${llvmPackages_18.llvm.dev}/include"

go build -x -a -v output:

[...]
TERM='dumb' CGO_LDFLAGS='"-O2" "-g" "-L/usr/lib/llvm-18/lib" "-lLLVM-18"' /nix/store/j9hk9x78z301jqldfyvw72z24vb992qi-go-1.22.6/share/go/pkg/tool/linux_amd64/cgo -objdir $WORK/b099/ -importpath tinygo.org/x/go-llvm -- -I/nix/store/8bbp6b9wb0lc4kiv7a6qrljsp8mbp4lf-llvm-18.1.8-dev/include -I/usr/include/llvm-18 -I/usr/include/llvm-c-18 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I $WORK/b099/ -O2 -g ./analysis.go ./bitreader.go ./bitwriter.go ./dibuilder.go ./executionengine.go ./ir.go ./irreader.go ./linker.go ./llvm_config_linux_llvm18.go ./passes.go ./support.go ./target.go ./version.go
# tinygo.org/x/go-llvm
In file included from /usr/include/llvm-c-18/llvm-c/Target.h:43,
                 from /usr/include/llvm-c-18/llvm-c/ExecutionEngine.h:23,
                 from ../../../go/pkg/mod/tinygo.org/x/[email protected]/executionengine.go:17:
/usr/include/llvm-18/llvm/Config/Targets.def:1:2: error: #error ("nope")
    1 | #error("nope")
      |  ^~~~~
In file included from /usr/include/llvm-c-18/llvm-c/Target.h:47:
/usr/include/llvm-18/llvm/Config/Targets.def:1:2: error: #error ("nope")
    1 | #error("nope")
      |  ^~~~~
In file included from /usr/include/llvm-c-18/llvm-c/Target.h:52:
/usr/include/llvm-18/llvm/Config/Targets.def:1:2: error: #error ("nope")
    1 | #error("nope")
      |  ^~~~~
In file included from /usr/include/llvm-c-18/llvm-c/Target.h:78:
/usr/include/llvm-18/llvm/Config/Targets.def:1:2: error: #error ("nope")
    1 | #error("nope")
      |  ^~~~~
In file included from /usr/include/llvm-c-18/llvm-c/Target.h:87:
/usr/include/llvm-18/llvm/Config/Targets.def:1:2: error: #error ("nope")
    1 | #error("nope")
      |  ^~~~~
In file included from /usr/include/llvm-c-18/llvm-c/Target.h:96:
/usr/include/llvm-18/llvm/Config/Targets.def:1:2: error: #error ("nope")
    1 | #error("nope")
      |  ^~~~~
[...]

IIUC: To fix this properly, the cgo flags in go-llvm must be generated dynamically, which currently only works with pkg-config. Unfortunately, llvm does not support pkg-config and has its own tool for this, llvm-config --cflags and llvm-config --ldflags, and I don't see a way to integrate it automatically. Apart from using go generate, but "(that) is intended for use by the author of the go package, not its clients."

So I'm out of ideas. :/

@deadprogram
Copy link
Member

This PR at least gets the CI back to passing while the more complete solution is considered.

Now merging, thank you @aykevl and @sylv-io

@deadprogram deadprogram merged commit 505e680 into dev Oct 17, 2024
25 checks passed
@deadprogram deadprogram deleted the nix-llvm18 branch October 17, 2024 13:22
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.

4 participants