Open kenbell opened 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
}
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.
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.
If you can provide the code so we can reproduce this that would be great!
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)
I will be happy to provide more details.
Yes, please provide a full reproducer. That way we can actually see what's going wrong.
tinygo version
@kenbell is this still an issue with the latest dev
branch?
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)
I tried this, but:
tinygo version 0.31.0-dev linux/arm64 (using go version go1.21.5 and LLVM version 17.0.6)
)In a distrobox with Debian 12 and LLVM 16, I got the following error:
$ tinygo version
tinygo version 0.31.0-dev linux/arm64 (using go version go1.19.8 and LLVM version 16.0.6)
$ tinygo build -target nano-rp2040 -stack-size 4kb -ldflags="-X 'main.ssid=test' -X 'main.pass=testtest'" ./examples/net/tlsclient/
# net
/home/ayke/src/tinygo/tinygo/src/net/ip.go:307:34: cannot convert p4 (variable of type IP) to [4]byte
/home/ayke/src/tinygo/tinygo/src/net/ip.go:309:35: cannot convert ip (variable of type IP) to [16]byte
This is with TinyGo c2083014b3361cb67e37a063828011894ec59b07 and drivers https://github.com/tinygo-org/drivers/commit/8642886f73f4f85000773c2eafc02274d5bf2163.
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?
@kenbell @aykevl is this still an issue or can it be closed?
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.
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
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
I'm getting this crash from LLVM:
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.