tinygo-org / tinygo

Go compiler for small places. Microcontrollers, WebAssembly (WASM/WASI), and command-line tools. Based on LLVM.
https://tinygo.org
Other
15.26k stars 901 forks source link

LLVM crash: "LLVM ERROR: underestimated function size" #2958

Open kenbell opened 2 years ago

kenbell commented 2 years ago

I'm getting this crash from LLVM:

LLVM ERROR: underestimated function size
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Running pass 'Function Pass Manager' on module '/tmp/tinygo4269388313/main.o'.
1.      Running pass 'ARM constant island placement and branch shortening pass' on function '@main.main'
 #0 0x00007f726aed8d01 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe3fd01)
 #1 0x00007f726aed6a3e llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe3da3e)
 #2 0x00007f726aed9236 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe40236)
 #3 0x00007f7269b80520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f7269bd4a7c __pthread_kill_implementation ./nptl/./nptl/pthread_kill.c:44:76
 #5 0x00007f7269bd4a7c __pthread_kill_internal ./nptl/./nptl/pthread_kill.c:78:10
 #6 0x00007f7269bd4a7c pthread_kill ./nptl/./nptl/pthread_kill.c:89:10
 #7 0x00007f7269b80476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007f7269b667f3 abort ./stdlib/./stdlib/abort.c:81:7
 #9 0x00007f726ae13723 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xd7a723)
#10 0x00007f726ae13556 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xd7a556)
#11 0x00007f726ce120cb (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x2d790cb)
#12 0x00007f726b25f2be llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x11c62be)
#13 0x00007f726b0133c0 llvm::FPPassManager::runOnFunction(llvm::Function&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xf7a3c0)
#14 0x00007f726b01a9b3 llvm::FPPassManager::runOnModule(llvm::Module&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xf819b3)
#15 0x00007f726b013f66 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xf7af66)
#16 0x00007f726c3feaff (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x2365aff)
#17 0x00007f726c3ffb48 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x2366b48)
#18 0x00007f726c3ff99a llvm::lto::thinBackend(llvm::lto::Config const&, unsigned int, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream> > > (unsigned int)>, llvm::Module&, llvm::ModuleSummaryIndex const&, llvm::StringMap<std::unordered_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >, llvm::MallocAllocator> const&, llvm::DenseMap<unsigned long, llvm::GlobalValueSummary*, llvm::DenseMapInfo<unsigned long, void>, llvm::detail::DenseMapPair<unsigned long, llvm::GlobalValueSummary*> > const&, llvm::MapVector<llvm::StringRef, llvm::BitcodeModule, llvm::DenseMap<llvm::StringRef, unsigned int, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, unsigned int> >, std::vector<std::pair<llvm::StringRef, llvm::BitcodeModule>, std::allocator<std::pair<llvm::StringRef, llvm::BitcodeModule> > > >*, std::vector<unsigned char, std::allocator<unsigned char> > const&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x236699a)
#19 0x00007f726c3f90e6 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x23600e6)
#20 0x00007f726c3f8d39 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x235fd39)
#21 0x00007f726b362d12 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x12c9d12)
#22 0x00007f726ae7b32b (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xde232b)
#23 0x00007f7269bd2b43 start_thread ./nptl/./nptl/pthread_create.c:442:8
#24 0x00007f7269c64a00 ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:83:0
error: failed to link /tmp/tinygo4269388313/main: signal: aborted (core dumped)

It looks like a genuine LLVM issue?

The error seems to relate to this LLVM code: https://github.com/llvm-mirror/llvm/blob/master/lib/Target/ARM/ARMConstantIslandPass.cpp#L1628 The change that introduced the error is: https://github.com/llvm-mirror/llvm/commit/aae431a7be048672cc98ce3bdb2268b681ab7201

I'm going to see if i can find a smaller repro case. It's currently being provoked by example code for a LoRa driver I'm writing. Randomly adding/removing code makes it go away, so it's a bit tricky to track down.

kenbell commented 2 years ago

This is the LLVM IR for main.main that is crashing...

; Function Attrs: minsize nounwind optsize
define internal void @main.main(i8* %context) #0 !dbg !167697 {
entry:
  %complit12 = alloca %"tinygo.org/x/drivers/sx127x.Config", align 4, !dbg !167736
  %complit9 = alloca %machine.SPIConfig, align 4, !dbg !167736
  %complit = alloca %"runtime/volatile.Register8", align 4, !dbg !167736
  %.fca.0.gep = getelementptr inbounds %"runtime/volatile.Register8", %"runtime/volatile.Register8"* %complit, i32 0, i32 0, !dbg !167736
  store i8 0, i8* %.fca.0.gep, align 1, !dbg !167736
  br i1 false, label %store.throw, label %store.next, !dbg !167737

store.next:                                       ; preds = %entry
  store i8 0, i8* %.fca.0.gep, align 1, !dbg !167737
  call void @"(machine.Pin).Configure"(i8 13, i8 0, i8* undef), !dbg !167738
  call void @"(machine.Pin).Set"(i8 13, i1 false, i8* undef), !dbg !167739
  call void @time.Sleep(i64 1000000000, i8* undef), !dbg !167740
  %0 = load %machine.SPI*, %machine.SPI** @machine.SPI0, align 4, !dbg !167741
  %1 = icmp eq %machine.SPI* %0, null, !dbg !167742
  br i1 %1, label %deref.throw, label %deref.next, !dbg !167742

deref.next:                                       ; preds = %store.next
  %2 = load %machine.SPI, %machine.SPI* %0, align 4, !dbg !167742
  %.fca.0.gep20 = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 0, !dbg !167736
  store i32 0, i32* %.fca.0.gep20, align 4, !dbg !167736
  %.fca.1.gep = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 1, !dbg !167736
  store i1 false, i1* %.fca.1.gep, align 4, !dbg !167736
  %.fca.2.gep = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 2, !dbg !167736
  store i8 0, i8* %.fca.2.gep, align 1, !dbg !167736
  %.fca.3.gep = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 3, !dbg !167736
  store i8 0, i8* %.fca.3.gep, align 2, !dbg !167736
  %.fca.4.gep = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 4, !dbg !167736
  store i8 0, i8* %.fca.4.gep, align 1, !dbg !167736
  %.fca.5.gep = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 5, !dbg !167736
  store i8 0, i8* %.fca.5.gep, align 4, !dbg !167736
  %.fca.6.gep = getelementptr inbounds %machine.SPIConfig, %machine.SPIConfig* %complit9, i32 0, i32 6, !dbg !167736
  store i8 0, i8* %.fca.6.gep, align 1, !dbg !167736
  br i1 false, label %store.throw10, label %store.next11, !dbg !167743

store.next11:                                     ; preds = %deref.next
  store i32 1000000, i32* %.fca.0.gep20, align 4, !dbg !167743
  %.fca.1.load = load i1, i1* %.fca.1.gep, align 4, !dbg !167744
  %.fca.1.insert = insertvalue %machine.SPIConfig { i32 1000000, i1 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison }, i1 %.fca.1.load, 1, !dbg !167744
  %.fca.2.load = load i8, i8* %.fca.2.gep, align 1, !dbg !167744
  %.fca.2.insert = insertvalue %machine.SPIConfig %.fca.1.insert, i8 %.fca.2.load, 2, !dbg !167744
  %.fca.3.load = load i8, i8* %.fca.3.gep, align 2, !dbg !167744
  %.fca.3.insert = insertvalue %machine.SPIConfig %.fca.2.insert, i8 %.fca.3.load, 3, !dbg !167744
  %.fca.4.load = load i8, i8* %.fca.4.gep, align 1, !dbg !167744
  %.fca.4.insert = insertvalue %machine.SPIConfig %.fca.3.insert, i8 %.fca.4.load, 4, !dbg !167744
  %.fca.5.load = load i8, i8* %.fca.5.gep, align 4, !dbg !167744
  %.fca.5.insert = insertvalue %machine.SPIConfig %.fca.4.insert, i8 %.fca.5.load, 5, !dbg !167744
  %.fca.6.load = load i8, i8* %.fca.6.gep, align 1, !dbg !167744
  %.fca.6.insert = insertvalue %machine.SPIConfig %.fca.5.insert, i8 %.fca.6.load, 6, !dbg !167744
  %3 = extractvalue %machine.SPI %2, 0, !dbg !167745
  %4 = call %runtime._interface @"(machine.SPI).Configure"(%"device/rp.SPI0_Type"* %3, %machine.SPIConfig %.fca.6.insert, i8* undef), !dbg !167745
  %modem = call i8* @runtime.alloc(i32 16, i8* inttoptr (i32 649 to i8*), i8* undef), !dbg !167746
  %5 = bitcast i8* %modem to %"tinygo.org/x/drivers/sx127x.Device"*, !dbg !167746
  %6 = load %machine.SPI*, %machine.SPI** @machine.SPI0, align 4, !dbg !167747
  %pack.ptr = bitcast %machine.SPI* %6 to i8*, !dbg !167747
  %7 = insertvalue %runtime._interface { i32 ptrtoint (%runtime.typecodeID* @"reflect/types.type:pointer:named:machine.SPI" to i32), i8* undef }, i8* %pack.ptr, 1, !dbg !167747
  %8 = extractvalue %runtime._interface %7, 0, !dbg !167748
  %9 = call %"tinygo.org/x/drivers/sx127x.Device" @"tinygo.org/x/drivers/sx127x.New"(i32 %8, i8* %pack.ptr, i8 28, i8 29, i8 6, i8* undef), !dbg !167748
  store %"tinygo.org/x/drivers/sx127x.Device" %9, %"tinygo.org/x/drivers/sx127x.Device"* %5, align 4, !dbg !167746
  call void @llvm.dbg.value(metadata %"tinygo.org/x/drivers/sx127x.Device" %9, metadata !167700, metadata !DIExpression()), !dbg !167746
  %.fca.0.gep30 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 0, !dbg !167736
  store i32 0, i32* %.fca.0.gep30, align 4, !dbg !167736
  %.fca.1.gep31 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 1, !dbg !167736
  store i8 0, i8* %.fca.1.gep31, align 4, !dbg !167736
  %.fca.2.gep32 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 2, !dbg !167736
  store i16 0, i16* %.fca.2.gep32, align 2, !dbg !167736
  %.fca.3.gep33 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 3, !dbg !167736
  store i8 0, i8* %.fca.3.gep33, align 4, !dbg !167736
  %.fca.4.gep34 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 4, !dbg !167736
  store i8 0, i8* %.fca.4.gep34, align 1, !dbg !167736
  %.fca.5.gep35 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 5, !dbg !167736
  store i32 0, i32* %.fca.5.gep35, align 4, !dbg !167736
  %.fca.6.gep36 = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 6, !dbg !167736
  store i8 0, i8* %.fca.6.gep36, align 4, !dbg !167736
  %.fca.7.gep = getelementptr inbounds %"tinygo.org/x/drivers/sx127x.Config", %"tinygo.org/x/drivers/sx127x.Config"* %complit12, i32 0, i32 7, !dbg !167736
  store i1 false, i1* %.fca.7.gep, align 1, !dbg !167736
  br i1 false, label %store.throw13, label %store.next14, !dbg !167749

store.next14:                                     ; preds = %store.next11
  store i32 868100000, i32* %.fca.0.gep30, align 4, !dbg !167749
  br i1 false, label %store.throw15, label %store.next16, !dbg !167750

store.next16:                                     ; preds = %store.next14
  store i8 1, i8* %.fca.6.gep36, align 1, !dbg !167750
  %.fca.0.load38 = load i32, i32* %.fca.0.gep30, align 4, !dbg !167751
  %.fca.0.insert39 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" undef, i32 %.fca.0.load38, 0, !dbg !167751
  %.fca.1.load41 = load i8, i8* %.fca.1.gep31, align 4, !dbg !167751
  %.fca.1.insert42 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.0.insert39, i8 %.fca.1.load41, 1, !dbg !167751
  %.fca.2.load44 = load i16, i16* %.fca.2.gep32, align 2, !dbg !167751
  %.fca.2.insert45 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.1.insert42, i16 %.fca.2.load44, 2, !dbg !167751
  %.fca.3.load47 = load i8, i8* %.fca.3.gep33, align 4, !dbg !167751
  %.fca.3.insert48 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.2.insert45, i8 %.fca.3.load47, 3, !dbg !167751
  %.fca.4.load50 = load i8, i8* %.fca.4.gep34, align 1, !dbg !167751
  %.fca.4.insert51 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.3.insert48, i8 %.fca.4.load50, 4, !dbg !167751
  %.fca.5.load53 = load i32, i32* %.fca.5.gep35, align 4, !dbg !167751
  %.fca.5.insert54 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.4.insert51, i32 %.fca.5.load53, 5, !dbg !167751
  %.fca.6.insert57 = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.5.insert54, i8 1, 6, !dbg !167751
  %.fca.7.load = load i1, i1* %.fca.7.gep, align 1, !dbg !167751
  %.fca.7.insert = insertvalue %"tinygo.org/x/drivers/sx127x.Config" %.fca.6.insert57, i1 %.fca.7.load, 7, !dbg !167751
  %10 = call %runtime._interface @"(*tinygo.org/x/drivers/sx127x.Device).Configure"(%"tinygo.org/x/drivers/sx127x.Device"* %5, %"tinygo.org/x/drivers/sx127x.Config" %.fca.7.insert, i8* undef), !dbg !167752
  call void @llvm.dbg.value(metadata %runtime._interface %10, metadata !167731, metadata !DIExpression()), !dbg !167753
  call void @llvm.dbg.value(metadata %runtime._interface %10, metadata !167731, metadata !DIExpression()), !dbg !167754
  %11 = extractvalue %runtime._interface %10, 0, !dbg !167755
  %12 = icmp eq i32 %11, 0, !dbg !167755
  %13 = xor i1 %12, true, !dbg !167755
  br i1 %13, label %if.then, label %if.done, !dbg !167742

if.then:                                          ; preds = %store.next16
  call void @llvm.dbg.value(metadata %runtime._interface %10, metadata !167731, metadata !DIExpression()), !dbg !167756
  %14 = extractvalue %runtime._interface %10, 1, !dbg !167757
  call void @runtime._panic(i32 %11, i8* %14, i8* undef), !dbg !167757
  unreachable, !dbg !167757

if.done:                                          ; preds = %store.next16
  %15 = call i1 @"(*tinygo.org/x/drivers/sx127x.Device).Detect"(%"tinygo.org/x/drivers/sx127x.Device"* %5, i8* undef), !dbg !167758
  br i1 %15, label %if.done1, label %if.then8, !dbg !167742

if.done1:                                         ; preds = %if.done
  call void @runtime.printstring(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @"main$string.54", i32 0, i32 0), i32 15, i8* undef), !dbg !167759
  call void @runtime.printnl(i8* undef), !dbg !167759
  call void @llvm.dbg.value(metadata i32 0, metadata !167732, metadata !DIExpression()), !dbg !167760
  br label %for.body, !dbg !167742

for.body:                                         ; preds = %for.loop, %if.done5, %if.then4, %if.then2, %if.done1
  %16 = phi i32 [ 0, %if.done1 ], [ %16, %if.then2 ], [ %16, %if.then4 ], [ %26, %if.done5 ], [ %26, %for.loop ], !dbg !167760
  %17 = call { { i8*, i32, i32 }, %runtime._interface } @"(*tinygo.org/x/drivers/sx127x.Device).LoraRx"(%"tinygo.org/x/drivers/sx127x.Device"* %5, i32 12345, i8* undef), !dbg !167761
  %18 = extractvalue { { i8*, i32, i32 }, %runtime._interface } %17, 0, !dbg !167761
  call void @llvm.dbg.value(metadata { i8*, i32, i32 } %18, metadata !167733, metadata !DIExpression()), !dbg !167762
  %19 = extractvalue { { i8*, i32, i32 }, %runtime._interface } %17, 1, !dbg !167761
  call void @llvm.dbg.value(metadata %runtime._interface %19, metadata !167734, metadata !DIExpression()), !dbg !167763
  call void @llvm.dbg.value(metadata %runtime._interface %19, metadata !167734, metadata !DIExpression()), !dbg !167764
  %20 = extractvalue %runtime._interface %19, 0, !dbg !167765
  %21 = icmp eq i32 %20, 0, !dbg !167765
  %22 = xor i1 %21, true, !dbg !167765
  br i1 %22, label %if.then2, label %if.done3, !dbg !167742

if.then2:                                         ; preds = %for.body
  call void @llvm.dbg.value(metadata %runtime._interface %19, metadata !167734, metadata !DIExpression()), !dbg !167766
  %23 = extractvalue %runtime._interface %19, 1, !dbg !167767
  call void @runtime.printitf(i32 %20, i8* %23, i8* undef), !dbg !167767
  call void @runtime.printnl(i8* undef), !dbg !167767
  br label %for.body, !dbg !167742

if.done3:                                         ; preds = %for.body
  call void @llvm.dbg.value(metadata { i8*, i32, i32 } %18, metadata !167733, metadata !DIExpression()), !dbg !167768
  %24 = extractvalue { i8*, i32, i32 } %18, 0, !dbg !167769
  %25 = icmp eq i8* %24, null, !dbg !167769
  br i1 %25, label %if.then4, label %if.done5, !dbg !167742

if.then4:                                         ; preds = %if.done3
  call void @runtime.printstring(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @"main$string.55", i32 0, i32 0), i32 28, i8* undef), !dbg !167770
  call void @runtime.printnl(i8* undef), !dbg !167770
  br label %for.body, !dbg !167742

if.done5:                                         ; preds = %if.done3
  %26 = add i32 %16, 1, !dbg !167771
  call void @llvm.dbg.value(metadata i32 %26, metadata !167732, metadata !DIExpression()), !dbg !167771
  call void @runtime.printstring(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @"main$string.56", i32 0, i32 0), i32 1, i8* undef), !dbg !167772
  call void @llvm.dbg.value(metadata { i8*, i32, i32 } %18, metadata !167733, metadata !DIExpression()), !dbg !167773
  %len = extractvalue { i8*, i32, i32 } %18, 1, !dbg !167774
  %27 = icmp sgt i32 %len, 4, !dbg !167775
  br i1 %27, label %if.then6, label %for.body, !dbg !167742

if.then6:                                         ; preds = %if.done5
  call void @llvm.dbg.value(metadata { i8*, i32, i32 } %18, metadata !167733, metadata !DIExpression()), !dbg !167776
  %28 = call %runtime._string @strconv.Itoa(i32 %len, i8* undef), !dbg !167777
  %29 = extractvalue %runtime._string %28, 0, !dbg !167778
  %30 = extractvalue %runtime._string %28, 1, !dbg !167778
  %31 = call %runtime._string @runtime.stringConcat(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"main$string.57", i32 0, i32 0), i32 7, i8* %29, i32 %30, i8* undef), !dbg !167778
  %32 = extractvalue %runtime._string %31, 0, !dbg !167779
  %33 = extractvalue %runtime._string %31, 1, !dbg !167779
  %34 = call %runtime._string @runtime.stringConcat(i8* %32, i32 %33, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @"main$string.58", i32 0, i32 0), i32 1, i8* undef), !dbg !167779
  %35 = extractvalue %runtime._string %34, 0, !dbg !167780
  %36 = extractvalue %runtime._string %34, 1, !dbg !167780
  call void @runtime.printstring(i8* %35, i32 %36, i8* undef), !dbg !167780
  call void @runtime.printnl(i8* undef), !dbg !167780
  call void @llvm.dbg.value(metadata i32 0, metadata !167735, metadata !DIExpression()), !dbg !167781
  br label %for.loop, !dbg !167742

for.loop:                                         ; preds = %lookup.next, %if.then6
  %37 = phi i32 [ 0, %if.then6 ], [ %58, %lookup.next ], !dbg !167781
  call void @llvm.dbg.value(metadata i32 %37, metadata !167735, metadata !DIExpression()), !dbg !167782
  call void @llvm.dbg.value(metadata { i8*, i32, i32 } %18, metadata !167733, metadata !DIExpression()), !dbg !167783
  %38 = icmp slt i32 %37, %len, !dbg !167784
  br i1 %38, label %for.body7, label %for.body, !dbg !167742

for.body7:                                        ; preds = %for.loop
  call void @llvm.dbg.value(metadata i32 %37, metadata !167735, metadata !DIExpression()), !dbg !167785
  %39 = call %runtime._string @strconv.Itoa(i32 %37, i8* undef), !dbg !167786
  %40 = extractvalue %runtime._string %39, 0, !dbg !167787
  %41 = extractvalue %runtime._string %39, 1, !dbg !167787
  %42 = call %runtime._string @runtime.stringConcat(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"main$string.59", i32 0, i32 0), i32 4, i8* %40, i32 %41, i8* undef), !dbg !167787
  %43 = extractvalue %runtime._string %42, 0, !dbg !167788
  %44 = extractvalue %runtime._string %42, 1, !dbg !167788
  %45 = call %runtime._string @runtime.stringConcat(i8* %43, i32 %44, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"main$string.60", i32 0, i32 0), i32 6, i8* undef), !dbg !167788
  call void @llvm.dbg.value(metadata { i8*, i32, i32 } %18, metadata !167733, metadata !DIExpression()), !dbg !167789
  call void @llvm.dbg.value(metadata i32 %37, metadata !167735, metadata !DIExpression()), !dbg !167790
  %46 = icmp uge i32 %37, %len, !dbg !167791
  br i1 %46, label %lookup.throw, label %lookup.next, !dbg !167791

lookup.next:                                      ; preds = %for.body7
  %47 = getelementptr inbounds i8, i8* %24, i32 %37, !dbg !167791
  %48 = load i8, i8* %47, align 1, !dbg !167791
  %49 = zext i8 %48 to i64, !dbg !167792
  %50 = call %runtime._string @strconv.FormatInt(i64 %49, i32 16, i8* undef), !dbg !167793
  %51 = extractvalue %runtime._string %45, 0, !dbg !167794
  %52 = extractvalue %runtime._string %45, 1, !dbg !167794
  %53 = extractvalue %runtime._string %50, 0, !dbg !167794
  %54 = extractvalue %runtime._string %50, 1, !dbg !167794
  %55 = call %runtime._string @runtime.stringConcat(i8* %51, i32 %52, i8* %53, i32 %54, i8* undef), !dbg !167794
  %56 = extractvalue %runtime._string %55, 0, !dbg !167795
  %57 = extractvalue %runtime._string %55, 1, !dbg !167795
  call void @runtime.printstring(i8* %56, i32 %57, i8* undef), !dbg !167795
  call void @runtime.printnl(i8* undef), !dbg !167795
  %58 = add i32 %37, 1, !dbg !167796
  call void @llvm.dbg.value(metadata i32 %58, metadata !167735, metadata !DIExpression()), !dbg !167796
  br label %for.loop, !dbg !167742

if.then8:                                         ; preds = %if.done
  call void @runtime._panic(i32 ptrtoint (%runtime.typecodeID* @"reflect/types.type:basic:string" to i32), i8* bitcast ({ %runtime._string }* @"main$pack" to i8*), i8* undef), !dbg !167797
  unreachable, !dbg !167797

store.throw:                                      ; preds = %entry
  call void @runtime.nilPanic(i8* undef), !dbg !167737
  unreachable, !dbg !167737

deref.throw:                                      ; preds = %store.next
  call void @runtime.nilPanic(i8* undef), !dbg !167742
  unreachable, !dbg !167742

store.throw10:                                    ; preds = %deref.next
  call void @runtime.nilPanic(i8* undef), !dbg !167743
  unreachable, !dbg !167743

store.throw13:                                    ; preds = %store.next11
  call void @runtime.nilPanic(i8* undef), !dbg !167749
  unreachable, !dbg !167749

store.throw15:                                    ; preds = %store.next14
  call void @runtime.nilPanic(i8* undef), !dbg !167750
  unreachable, !dbg !167750

lookup.throw:                                     ; preds = %for.body7
  call void @runtime.lookupPanic(i8* undef), !dbg !167791
  unreachable, !dbg !167791
}
kenbell commented 2 years ago

Closing this - I've been unable to reproduce using the BYOLLVM option - so looks like it may be an issue with the Ubuntu-supplied LLVM14.

tonygilkerson commented 2 years ago

I am getting this error right after upgrading to go v1.19 I am on a mac. What commands can I run to provide the proper information for this ticket?

tinygo build -target=pico
LLVM ERROR: underestimated function size
error: failed to link /var/folders/pt/rkqfz9js2kvf9cvkk5m052wm0000gp/T/tinygo3160594387/main: signal: abort trap

I did some testing and the issues occurs when I return an error and try to print the contents of the error.

aykevl commented 2 years ago

If you can provide the code so we can reproduce this that would be great!

roman-dvorak commented 1 year ago

Hi, I am also falling into this error.

$ tinygo flash -target=pico main.go -v
LLVM ERROR: underestimated function size
error: failed to link /tmp/tinygo2959922757/main: signal: aborted (core dumped)

It happens when I try to convert int16 value to float value.

  d.WriteByte(0xBE)
  var data [9]byte

  for i := 0; i < 8; i++ {
    data[i] = d.ReadByte()
  }

  var temp int16

  temp |= int16(data[0])
  temp |= (int16(data[1])&0x0f) << 8

  ftemp := float32(temp)/16.0
  println("RAWTEMP", temp, ftemp)

After deleting the float32 function from the code, compilation will occur without error.

I will be happy to provide more details.

  Ubuntu 22.04, 

  $ llvm-config --version
  14.0.0

  $ tinygo version
  tinygo version 0.25.0 linux/amd64 (using go version go1.18.1 and LLVM version   14.0.0)
aykevl commented 1 year ago

I will be happy to provide more details.

Yes, please provide a full reproducer. That way we can actually see what's going wrong.

deadprogram commented 1 year ago

@kenbell is this still an issue with the latest dev branch?

scottfeldman commented 9 months ago

I'm hitting this LLVM error with dev branch. Seems 100% reproducible. Here's what I did:

Modified drivers:examples/net/tlsclient/main.go with this patch

sfeldma@nuc:~/work/drivers$ git diff examples/
diff --git a/examples/net/tlsclient/main.go b/examples/net/tlsclient/main.go
index 186fdd5..cd0a1b6 100644
--- a/examples/net/tlsclient/main.go
+++ b/examples/net/tlsclient/main.go
@@ -28,10 +28,12 @@ var (
        ssid string
        pass string
        // HTTPS server address to hit with a GET / request
-       address string = "httpbin.org:443"
+       address  string = "httpbin.org:443"
+       address2 string = "192.168.1.213:8080"
 )

 var conn net.Conn
+var conn2 net.Conn

 // Wait for user to open serial console
 func waitSerial() {
@@ -70,6 +72,18 @@ func dialConnection() {
        println("Connected!\r")
 }

+func dialConnection2() {
+       var err error
+
+       println("\r\n---------------\r\nDialing TCP connection2")
+       conn2, err = net.Dial("tcp", address2)
+       for ; err != nil; conn2, err = net.Dial("tcp", address2) {
+               println("Connection failed:", err.Error())
+               time.Sleep(5 * time.Second)
+       }
+       println("Connected!\r")
+}
+
 func makeRequest() {
        print("Sending HTTPS request...")
        w := bufio.NewWriter(conn)
@@ -97,6 +111,7 @@ func main() {

        for i := 0; ; i++ {
                dialConnection()
+               dialConnection2()
                makeRequest()
                readResponse()
                closeConnection()

And try to build it:

sfeldma@nuc:~/work/drivers$ tinygo build -target nano-rp2040 -stack-size 4kb -ldflags="-X 'main.ssid=test' -X 'main.pass=testtest'" ./examples/net/tlsclient/
LLVM ERROR: underestimated function size
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Running pass 'Function Pass Manager' on module '/tmp/tinygo3956045343/main.o'.
1.      Running pass 'ARM constant island placement and branch shortening pass' on function '@main.main'
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  libLLVM-16.so.1 0x00007f1137fbec16 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 54
1  libLLVM-16.so.1 0x00007f1137fbcdb0 llvm::sys::RunSignalHandlers() + 80
2  libLLVM-16.so.1 0x00007f1137fbf3eb
3  libc.so.6       0x00007f1136842520
4  libc.so.6       0x00007f11368969fc pthread_kill + 300
5  libc.so.6       0x00007f1136842476 raise + 22
6  libc.so.6       0x00007f11368287f3 abort + 211
7  libLLVM-16.so.1 0x00007f1137f0ae15 llvm::report_fatal_error(llvm::Twine const&, bool) + 437
8  libLLVM-16.so.1 0x00007f1137f0ac56
9  libLLVM-16.so.1 0x00007f113a042997
10 libLLVM-16.so.1 0x00007f1138346d6b llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 635
11 libLLVM-16.so.1 0x00007f11380f4d3d llvm::FPPassManager::runOnFunction(llvm::Function&) + 653
12 libLLVM-16.so.1 0x00007f11380fa983 llvm::FPPassManager::runOnModule(llvm::Module&) + 51
13 libLLVM-16.so.1 0x00007f11380f53f5 llvm::legacy::PassManagerImpl::run(llvm::Module&) + 965
14 libLLVM-16.so.1 0x00007f113947c6ca
15 libLLVM-16.so.1 0x00007f113947d5f0
16 libLLVM-16.so.1 0x00007f113947d47f llvm::lto::thinBackend(llvm::lto::Config const&, unsigned int, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, llvm::Module&, llvm::ModuleSummaryIndex const&, llvm::StringMap<std::unordered_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long>>, llvm::MallocAllocator> const&, llvm::DenseMap<unsigned long, llvm::GlobalValueSummary*, llvm::DenseMapInfo<unsigned long, void>, llvm::detail::DenseMapPair<unsigned long, llvm::GlobalValueSummary*>> const&, llvm::MapVector<llvm::StringRef, llvm::BitcodeModule, llvm::DenseMap<llvm::StringRef, unsigned int, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, unsigned int>>, std::vector<std::pair<llvm::StringRef, llvm::BitcodeModule>, std::allocator<std::pair<llvm::StringRef, llvm::BitcodeModule>>>>*, std::vector<unsigned char, std::allocator<unsigned char>> const&) + 2927
17 libLLVM-16.so.1 0x00007f1139476ed9
18 libLLVM-16.so.1 0x00007f1139476883
19 libLLVM-16.so.1 0x00007f113843f984
20 libLLVM-16.so.1 0x00007f1137f6bdf8 llvm::ThreadPool::processTasks(llvm::ThreadPoolTaskGroup*) + 760
21 libLLVM-16.so.1 0x00007f1137f6c893
22 libc.so.6       0x00007f1136894ac3
23 libc.so.6       0x00007f1136926660
error: failed to link /tmp/tinygo3956045343/main: signal: aborted (core dumped)

What's weird if I comment out a println in the new dialConnection2 func, I don't get the LLVM error:

+func dialConnection2() {
+       var err error
+
+       println("\r\n---------------\r\nDialing TCP connection2")
+       conn2, err = net.Dial("tcp", address2)
+       for ; err != nil; conn2, err = net.Dial("tcp", address2) {
+               //println("Connection failed:", err.Error())
+               time.Sleep(5 * time.Second)
+       }
+       println("Connected!\r")
+}

Now it builds fine.

sfeldma@nuc:~/work/drivers$ tinygo version
tinygo version 0.31.0-dev linux/amd64 (using go version go1.21.5 and LLVM version 16.0.6)
aykevl commented 9 months ago

I tried this, but:

This is with TinyGo c2083014b3361cb67e37a063828011894ec59b07 and drivers https://github.com/tinygo-org/drivers/commit/8642886f73f4f85000773c2eafc02274d5bf2163.

aykevl commented 9 months ago

I can reproduce this (Debian 12, LLVM 16 from apt.llvm.org, Go 1.21.5 from https://go.dev/dl) but not in LLVM 17 (same environment but with LLVM 17). Maybe this bug got fixed in LLVM 17?

deadprogram commented 5 months ago

@kenbell @aykevl is this still an issue or can it be closed?

aykevl commented 5 months ago

I haven't heard anybody about this bug, and I think it's been fixed somewhere after LLVM 15. Let's close this. We can always reopen it if needed.

lasselj commented 2 weeks ago

I am also struggling with same rather arbitrary problem. Here is a loom that shows it can be as little as a single fmt.Printf that causes the "LLVM ERROR: underestimated function size" problem:

https://www.loom.com/share/ad62d17323d546d5864b9becb2b5f191?sid=932029c2-f387-4f78-b68d-994ec4c77ad4

aykevl commented 2 weeks ago

Yeah, I'm afraid it's still present. It just happens very rarely, in specific cases. Modifying the code a bit in some arbitrary way can work around the problem.

Here is the upstream LLVM bug: https://github.com/llvm/llvm-project/issues/95683