Why do I get `bus error` when calling LLVM IR function?

36 Views Asked by At

For this code in my language:

type Struct:
    x: Bool

Struct { x: true }

My frontend generates the following LLVM IR:

%Struct = type { i1 }

define %Struct @execute() {
  %1 = alloca %Struct, align 8
  %Struct.x = getelementptr inbounds %Struct, ptr %1, i32 0, i32 0
  store i1 true, ptr %Struct.x, align 1
  %2 = load %Struct, ptr %1, align 1
  ret %Struct %2
}

However, calling this function leads to 63069 bus error.

But if I'll write Struct { x: true }.x, it will generate:

%Struct = type { i1 }

define i1 @execute() {
  %1 = alloca %Struct, align 8
  %Struct.x = getelementptr inbounds %Struct, ptr %1, i32 0, i32 0
  store i1 true, ptr %Struct.x, align 1
  %x = getelementptr inbounds %Struct, ptr %1, i32 0, i32 0
  %2 = load i1, ptr %x, align 1
  ret i1 %2
}

And this code executes correctly.

What's wrong when I return a struct?

P.S: there is a different error inside debugger enter image description here

1

There are 1 best solutions below

0
On

The generated IR can be compiled by clang and executed without issues, hence it should be correct.

Looks like the error was caused by an internal bug in llvm 16.0, which was used to JIT-compile and run the code