Odin
Odin copied to clipboard
Metal example doesn't compile: LLVM CODE GEN FAILED for build_shaders
I'm getting an error building Metal examples.
macOS 13 beta 4 arm64 (kernel version 22.0) Odin dev-2022-08:a0135080 LLVM 14.0.6 (same error with LLVM 13) RAM: 32768 MiB
Please note that this source change would have to be made first before you see the below output:

/Users/vitaly/projects/odin-examples/learn_metal/01-primitive $ odin run .
LLVM CODE GEN FAILED FOR PROCEDURE: main.build_shaders
define internal void @main.build_shaders({ %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* noalias sret({ %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }) %agg.result, %objc_Metal.Device* %0, i8* noalias nocapture nonnull %__.context_ptr) {
decls:
%1 = alloca %objc_Metal.Device*, align 8
%2 = alloca %..string, align 8
%3 = alloca %objc_Foundation.String*, align 8
%4 = alloca { %objc_Metal.Library*, %objc_Foundation.Error* }, align 8
%5 = alloca %objc_Metal.Function*, align 8
%6 = alloca %objc_Metal.Function*, align 8
%7 = alloca %objc_Metal.RenderPipelineDescriptor*, align 8
%8 = alloca { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, align 8
br label %entry
entry: ; preds = %decls
store %objc_Metal.Device* %0, %objc_Metal.Device** %1, align 8
%9 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
%10 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
%11 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
%12 = bitcast i8* %__.context_ptr to %runtime.Context*
store %..string { i8* getelementptr inbounds ([552 x i8], [552 x i8]* @"csbs$1bc", i64 0, i64 0), i64 551 }, %..string* %2, align 8
%13 = bitcast %runtime.Context* %12 to i8*
%14 = call %objc_Foundation.String* @objc_Foundation.String_alloc(i8* %13)
%15 = load %..string, %..string* %2, align 8
%16 = bitcast %..string* %2 to [2 x i64]*
%17 = load [2 x i64], [2 x i64]* %16, align 8
%18 = bitcast %runtime.Context* %12 to i8*
%19 = call %objc_Foundation.String* @objc_Foundation.String_initWithOdinString(%objc_Foundation.String* %14, [2 x i64] %17, i8* %18)
store %objc_Foundation.String* %19, %objc_Foundation.String** %3, align 8
%20 = load %objc_Metal.Device*, %objc_Metal.Device** %1, align 8
%21 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
%22 = bitcast %runtime.Context* %12 to i8*
%23 = call [2 x i64] @objc_Metal.Device_newLibraryWithSource(%objc_Metal.Device* %20, %objc_Foundation.String* %21, %objc_Metal.CompileOptions* null, i8* %22)
%24 = bitcast { %objc_Metal.Library*, %objc_Foundation.Error* }* %4 to [2 x i64]*
store [2 x i64] %23, [2 x i64]* %24, align 8
%25 = load { %objc_Metal.Library*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Foundation.Error* }* %4, align 8
%26 = getelementptr inbounds { %objc_Metal.Library*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Foundation.Error* }* %4, i32 0, i32 0
%27 = load %objc_Metal.Library*, %objc_Metal.Library** %26, align 8
%28 = getelementptr inbounds { %objc_Metal.Library*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Foundation.Error* }* %4, i32 0, i32 1
%29 = load %objc_Foundation.Error*, %objc_Foundation.Error** %28, align 8
%30 = icmp eq %objc_Foundation.Error* %29, null
br i1 %30, label %or_return.continue, label %or_return.return
or_return.return: ; preds = %entry
store %objc_Foundation.Error* %29, %objc_Foundation.Error** %11, align 8
%31 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
%32 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %10, align 8
%33 = load %objc_Foundation.Error*, %objc_Foundation.Error** %11, align 8
store %objc_Metal.Library* %31, %objc_Metal.Library** %9, align 8
store %objc_Metal.RenderPipelineState* %32, %objc_Metal.RenderPipelineState** %10, align 8
store %objc_Foundation.Error* %33, %objc_Foundation.Error** %11, align 8
%34 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
%35 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
%36 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
store %objc_Metal.Library* %31, %objc_Metal.Library** %34, align 8
store %objc_Metal.RenderPipelineState* %32, %objc_Metal.RenderPipelineState** %35, align 8
store %objc_Foundation.Error* %33, %objc_Foundation.Error** %36, align 8
br label %defer
defer: ; preds = %or_return.return
%37 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
%38 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %37, i32 0, i32 0
%39 = getelementptr inbounds %"objc_Foundation.Copying(String)-12202", %"objc_Foundation.Copying(String)-12202"* %38, i32 0, i32 0
%40 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %39, i8* %40)
ret void
or_return.continue: ; preds = %entry
store %objc_Metal.Library* %27, %objc_Metal.Library** %9, align 8
%41 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
%42 = call %objc_Foundation.String* @objc_Foundation.MakeConstantString(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @"csbs$1bd", i64 0, i64 0))
%43 = bitcast %runtime.Context* %12 to i8*
%44 = call %objc_Metal.Function* @objc_Metal.Library_newFunctionWithName(%objc_Metal.Library* %41, %objc_Foundation.String* %42, i8* %43)
store %objc_Metal.Function* %44, %objc_Metal.Function** %5, align 8
%45 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
%46 = call %objc_Foundation.String* @objc_Foundation.MakeConstantString(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"csbs$1be", i64 0, i64 0))
%47 = bitcast %runtime.Context* %12 to i8*
%48 = call %objc_Metal.Function* @objc_Metal.Library_newFunctionWithName(%objc_Metal.Library* %45, %objc_Foundation.String* %46, i8* %47)
store %objc_Metal.Function* %48, %objc_Metal.Function** %6, align 8
%49 = bitcast %runtime.Context* %12 to i8*
%50 = call %objc_Metal.RenderPipelineDescriptor* @objc_Metal.RenderPipelineDescriptor_alloc(i8* %49)
%51 = bitcast %runtime.Context* %12 to i8*
%52 = call %objc_Metal.RenderPipelineDescriptor* @objc_Metal.RenderPipelineDescriptor_init(%objc_Metal.RenderPipelineDescriptor* %50, i8* %51)
store %objc_Metal.RenderPipelineDescriptor* %52, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%53 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%54 = load %objc_Metal.Function*, %objc_Metal.Function** %5, align 8
%55 = bitcast %runtime.Context* %12 to i8*
call void @objc_Metal.RenderPipelineDescriptor_setVertexFunction(%objc_Metal.RenderPipelineDescriptor* %53, %objc_Metal.Function* %54, i8* %55)
%56 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%57 = load %objc_Metal.Function*, %objc_Metal.Function** %6, align 8
%58 = bitcast %runtime.Context* %12 to i8*
call void @objc_Metal.RenderPipelineDescriptor_setFragmentFunction(%objc_Metal.RenderPipelineDescriptor* %56, %objc_Metal.Function* %57, i8* %58)
%59 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%60 = bitcast %runtime.Context* %12 to i8*
%61 = call %objc_Metal.RenderPipelineColorAttachmentDescriptorArray* @objc_Metal.RenderPipelineDescriptor_colorAttachments(%objc_Metal.RenderPipelineDescriptor* %59, i8* %60)
%62 = bitcast %runtime.Context* %12 to i8*
%63 = call %objc_Metal.RenderPipelineColorAttachmentDescriptor* @objc_Metal.RenderPipelineColorAttachmentDescriptorArray_object(%objc_Metal.RenderPipelineColorAttachmentDescriptorArray* %61, i64 0, i8* %62)
%64 = bitcast %runtime.Context* %12 to i8*
call void @objc_Metal.RenderPipelineColorAttachmentDescriptor_setPixelFormat(%objc_Metal.RenderPipelineColorAttachmentDescriptor* %63, i64 81, i8* %64)
%65 = load %objc_Metal.Device*, %objc_Metal.Device** %1, align 8
%66 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%67 = bitcast %runtime.Context* %12 to i8*
%68 = call [2 x i64] @objc_Metal.Device_newRenderPipelineStateWithDescriptor(%objc_Metal.Device* %65, %objc_Metal.RenderPipelineDescriptor* %66, i8* %67)
%69 = bitcast { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8 to [2 x i64]*
store [2 x i64] %68, [2 x i64]* %69, align 8
%70 = load { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8, align 8
%71 = getelementptr inbounds { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8, i32 0, i32 0
%72 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %71, align 8
%73 = getelementptr inbounds { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8, i32 0, i32 1
%74 = load %objc_Foundation.Error*, %objc_Foundation.Error** %73, align 8
%75 = icmp eq %objc_Foundation.Error* %74, null
br i1 %75, label %or_return.continue6, label %or_return.return1
or_return.return1: ; preds = %or_return.continue
store %objc_Foundation.Error* %74, %objc_Foundation.Error** %11, align 8
%76 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
%77 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %10, align 8
%78 = load %objc_Foundation.Error*, %objc_Foundation.Error** %11, align 8
store %objc_Metal.Library* %76, %objc_Metal.Library** %9, align 8
store %objc_Metal.RenderPipelineState* %77, %objc_Metal.RenderPipelineState** %10, align 8
store %objc_Foundation.Error* %78, %objc_Foundation.Error** %11, align 8
%79 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
%80 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
%81 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
store %objc_Metal.Library* %76, %objc_Metal.Library** %79, align 8
store %objc_Metal.RenderPipelineState* %77, %objc_Metal.RenderPipelineState** %80, align 8
store %objc_Foundation.Error* %78, %objc_Foundation.Error** %81, align 8
br label %defer2
defer2: ; preds = %or_return.return1
%82 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%83 = getelementptr inbounds %objc_Metal.RenderPipelineDescriptor, %objc_Metal.RenderPipelineDescriptor* %82, i32 0, i32 0
%84 = getelementptr inbounds %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622", %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622"* %83, i32 0, i32 0
%85 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %84, i8* %85)
br label %defer3
defer3: ; preds = %defer2
%86 = load %objc_Metal.Function*, %objc_Metal.Function** %6, align 8
%87 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %86, i32 0, i32 0
%88 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %87, i8* %88)
br label %defer4
defer4: ; preds = %defer3
%89 = load %objc_Metal.Function*, %objc_Metal.Function** %5, align 8
%90 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %89, i32 0, i32 0
%91 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %90, i8* %91)
br label %defer5
defer5: ; preds = %defer4
%92 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %37, i32 0, i32 0
%93 = getelementptr inbounds %"objc_Foundation.Copying(String)-12202", %"objc_Foundation.Copying(String)-12202"* %92, i32 0, i32 0
%94 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %93, i8* %94)
ret void
or_return.continue6: ; preds = %or_return.continue
store %objc_Metal.RenderPipelineState* %72, %objc_Metal.RenderPipelineState** %10, align 8
%95 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
%96 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %10, align 8
%97 = load %objc_Foundation.Error*, %objc_Foundation.Error** %11, align 8
store %objc_Metal.Library* %95, %objc_Metal.Library** %9, align 8
store %objc_Metal.RenderPipelineState* %96, %objc_Metal.RenderPipelineState** %10, align 8
store %objc_Foundation.Error* %97, %objc_Foundation.Error** %11, align 8
%98 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
%99 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
%100 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
store %objc_Metal.Library* %95, %objc_Metal.Library** %98, align 8
store %objc_Metal.RenderPipelineState* %96, %objc_Metal.RenderPipelineState** %99, align 8
store %objc_Foundation.Error* %97, %objc_Foundation.Error** %100, align 8
br label %defer7
defer7: ; preds = %or_return.continue6
%101 = getelementptr inbounds %objc_Metal.RenderPipelineDescriptor, %objc_Metal.RenderPipelineDescriptor* %82, i32 0, i32 0
%102 = getelementptr inbounds %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622", %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622"* %101, i32 0, i32 0
%103 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %102, i8* %103)
br label %defer8
defer8: ; preds = %defer7
%104 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %86, i32 0, i32 0
%105 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %104, i8* %105)
br label %defer9
defer9: ; preds = %defer8
%106 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %89, i32 0, i32 0
%107 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %106, i8* %107)
br label %defer10
defer10: ; preds = %defer9
%108 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
%109 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %108, i32 0, i32 0
%110 = getelementptr inbounds %"objc_Foundation.Copying(String)-12202", %"objc_Foundation.Copying(String)-12202"* %109, i32 0, i32 0
%111 = bitcast %runtime.Context* %12 to i8*
call void @objc_Foundation.release(%objc_Foundation.Object* %110, i8* %111)
ret void
}
Instruction does not dominate all uses!
%37 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
%92 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %37, i32 0, i32 0
Instruction does not dominate all uses!
%82 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
%101 = getelementptr inbounds %objc_Metal.RenderPipelineDescriptor, %objc_Metal.RenderPipelineDescriptor* %82, i32 0, i32 0
Instruction does not dominate all uses!
%86 = load %objc_Metal.Function*, %objc_Metal.Function** %6, align 8
%104 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %86, i32 0, i32 0
Instruction does not dominate all uses!
%89 = load %objc_Metal.Function*, %objc_Metal.Function** %5, align 8
%106 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %89, i32 0, i32 0
/Users/vitaly/projects/odin-examples/learn_metal/01-primitive $
@gingerBill any update on fixing this regression?
I found the commit that broke it: https://github.com/odin-lang/Odin/commit/199dae6cd52d5401d6f71b73eef235814d5ab223