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

Generate julia wrappers for LLVM19 #503

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

yuyichao
Copy link
Contributor

See below for the difference from 18.

AFAICT, the only breaking change that's used in this repo is the removal of fcmp, icmp and shl constant expressions.

Difference between 18 and 19
diff -u 18/libLLVM.jl 19/libLLVM.jl
--- 18/libLLVM.jl	2025-01-21 09:44:18.425196908 -0500
+++ 19/libLLVM.jl	2025-01-21 09:44:18.425196908 -0500
@@ -83,6 +83,8 @@
 
 mutable struct LLVMOpaqueBinary end
 
+mutable struct LLVMOpaqueDbgRecord end
+
 mutable struct LLVMOpaqueTargetData end
 
 mutable struct LLVMOpaqueTargetLibraryInfotData end
@@ -659,6 +661,7 @@
     LLVMInstructionValueKind = 24
     LLVMPoisonValueValueKind = 25
     LLVMConstantTargetNoneValueKind = 26
+    LLVMConstantPtrAuthValueKind = 27
 end
 
 """
@@ -778,23 +781,25 @@
 """
     LLVMAtomicRMWBinOp
 
-| Enumerator             | Note                                                                                                        |
-| :--------------------- | :---------------------------------------------------------------------------------------------------------- |
-| LLVMAtomicRMWBinOpXchg | Set the new value and return the one old                                                                    |
-| LLVMAtomicRMWBinOpAdd  | Add a value and return the old one                                                                          |
-| LLVMAtomicRMWBinOpSub  | Subtract a value and return the old one                                                                     |
-| LLVMAtomicRMWBinOpAnd  | And a value and return the old one                                                                          |
-| LLVMAtomicRMWBinOpNand | Not-And a value and return the old one                                                                      |
-| LLVMAtomicRMWBinOpOr   | OR a value and return the old one                                                                           |
-| LLVMAtomicRMWBinOpXor  | Xor a value and return the old one                                                                          |
-| LLVMAtomicRMWBinOpMax  | Sets the value if it's greater than the original using a signed comparison and return the old one           |
-| LLVMAtomicRMWBinOpMin  | Sets the value if it's Smaller than the original using a signed comparison and return the old one           |
-| LLVMAtomicRMWBinOpUMax | Sets the value if it's greater than the original using an unsigned comparison and return the old one        |
-| LLVMAtomicRMWBinOpUMin |                                                                                                             |
-| LLVMAtomicRMWBinOpFAdd | Add a floating point value and return the old one                                                           |
-| LLVMAtomicRMWBinOpFSub | Subtract a floating point value and return the old one                                                      |
-| LLVMAtomicRMWBinOpFMax | Sets the value if it's greater than the original using an floating point comparison and return the old one  |
-| LLVMAtomicRMWBinOpFMin | Sets the value if it's smaller than the original using an floating point comparison and return the old one  |
+| Enumerator                 | Note                                                                                                        |
+| :------------------------- | :---------------------------------------------------------------------------------------------------------- |
+| LLVMAtomicRMWBinOpXchg     | Set the new value and return the one old                                                                    |
+| LLVMAtomicRMWBinOpAdd      | Add a value and return the old one                                                                          |
+| LLVMAtomicRMWBinOpSub      | Subtract a value and return the old one                                                                     |
+| LLVMAtomicRMWBinOpAnd      | And a value and return the old one                                                                          |
+| LLVMAtomicRMWBinOpNand     | Not-And a value and return the old one                                                                      |
+| LLVMAtomicRMWBinOpOr       | OR a value and return the old one                                                                           |
+| LLVMAtomicRMWBinOpXor      | Xor a value and return the old one                                                                          |
+| LLVMAtomicRMWBinOpMax      | Sets the value if it's greater than the original using a signed comparison and return the old one           |
+| LLVMAtomicRMWBinOpMin      | Sets the value if it's Smaller than the original using a signed comparison and return the old one           |
+| LLVMAtomicRMWBinOpUMax     | Sets the value if it's greater than the original using an unsigned comparison and return the old one        |
+| LLVMAtomicRMWBinOpUMin     |                                                                                                             |
+| LLVMAtomicRMWBinOpFAdd     | Add a floating point value and return the old one                                                           |
+| LLVMAtomicRMWBinOpFSub     | Subtract a floating point value and return the old one                                                      |
+| LLVMAtomicRMWBinOpFMax     | Sets the value if it's greater than the original using an floating point comparison and return the old one  |
+| LLVMAtomicRMWBinOpFMin     | Sets the value if it's smaller than the original using an floating point comparison and return the old one  |
+| LLVMAtomicRMWBinOpUIncWrap | Increments the value, wrapping back to zero when incremented above input value                              |
+| LLVMAtomicRMWBinOpUDecWrap | Decrements the value, wrapping back to the input value when decremented below zero                          |
 """
 @cenum LLVMAtomicRMWBinOp::UInt32 begin
     LLVMAtomicRMWBinOpXchg = 0
@@ -812,6 +817,8 @@
     LLVMAtomicRMWBinOpFSub = 12
     LLVMAtomicRMWBinOpFMax = 13
     LLVMAtomicRMWBinOpFMin = 14
+    LLVMAtomicRMWBinOpUIncWrap = 15
+    LLVMAtomicRMWBinOpUDecWrap = 16
 end
 
 @cenum LLVMDiagnosticSeverity::UInt32 begin
@@ -848,15 +855,17 @@
 end
 
 """
-    __JL_Ctag_85
+    __JL_Ctag_1
 
 Attribute index are either LLVMAttributeReturnIndex, LLVMAttributeFunctionIndex or a parameter number from 1 to N.
 """
-@cenum __JL_Ctag_85::Int32 begin
+@cenum __JL_Ctag_1::Int32 begin
     LLVMAttributeReturnIndex = 0
     LLVMAttributeFunctionIndex = -1
 end
 
+const LLVMAttributeIndex = Cuint
+
 """
     LLVMTailCallKind
 
@@ -874,9 +883,7 @@
     LLVMTailCallKindNoTail = 3
 end
 
-const LLVMAttributeIndex = Cuint
-
-@cenum __JL_Ctag_87::UInt32 begin
+@cenum __JL_Ctag_2::UInt32 begin
     LLVMFastMathAllowReassoc = 1
     LLVMFastMathNoNaNs = 2
     LLVMFastMathNoInfs = 4
@@ -895,6 +902,19 @@
 """
 const LLVMFastMathFlags = Cuint
 
+@cenum __JL_Ctag_3::UInt32 begin
+    LLVMGEPFlagInBounds = 1
+    LLVMGEPFlagNUSW = 2
+    LLVMGEPFlagNUW = 4
+end
+
+"""
+Flags that constrain the allowed wrap semantics of a getelementptr instruction.
+
+See https://llvm.org/docs/LangRef.html#getelementptr-instruction
+"""
+const LLVMGEPNoWrapFlags = Cuint
+
 """
     LLVMShutdown()
 
@@ -1154,6 +1174,17 @@
 end
 
 """
+    LLVMCreateConstantRangeAttribute(C, KindID, NumBits, LowerWords, UpperWords)
+
+Create a ConstantRange attribute.
+
+LowerWords and UpperWords need to be NumBits divided by 64 rounded up elements long.
+"""
+function LLVMCreateConstantRangeAttribute(C, KindID, NumBits, LowerWords, UpperWords)
+    ccall((:LLVMCreateConstantRangeAttribute, libllvm), LLVMAttributeRef, (LLVMContextRef, Cuint, Cuint, Ptr{UInt64}, Ptr{UInt64}), C, KindID, NumBits, LowerWords, UpperWords)
+end
+
+"""
     LLVMCreateStringAttribute(C, K, KLength, V, VLength)
 
 Create a string attribute.
@@ -1251,6 +1282,28 @@
 end
 
 """
+    LLVMIsNewDbgInfoFormat(M)
+
+Soon to be deprecated. See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
+
+Returns true if the module is in the new debug info mode which uses non-instruction debug records instead of debug intrinsics for variable location tracking.
+"""
+function LLVMIsNewDbgInfoFormat(M)
+    ccall((:LLVMIsNewDbgInfoFormat, libllvm), LLVMBool, (LLVMModuleRef,), M)
+end
+
+"""
+    LLVMSetIsNewDbgInfoFormat(M, UseNewFormat)
+
+Soon to be deprecated. See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
+
+Convert module into desired debug info format.
+"""
+function LLVMSetIsNewDbgInfoFormat(M, UseNewFormat)
+    ccall((:LLVMSetIsNewDbgInfoFormat, libllvm), Cvoid, (LLVMModuleRef, LLVMBool), M, UseNewFormat)
+end
+
+"""
     LLVMGetModuleIdentifier(M, Len)
 
 Obtain the identifier of a module.
@@ -2504,6 +2557,54 @@
 end
 
 """
+    LLVMGetConstantPtrAuthPointer(PtrAuth)
+
+Get the pointer value for the associated ConstantPtrAuth constant.
+
+# See also
+llvm::ConstantPtrAuth::getPointer
+"""
+function LLVMGetConstantPtrAuthPointer(PtrAuth)
+    ccall((:LLVMGetConstantPtrAuthPointer, libllvm), LLVMValueRef, (LLVMValueRef,), PtrAuth)
+end
+
+"""
+    LLVMGetConstantPtrAuthKey(PtrAuth)
+
+Get the key value for the associated ConstantPtrAuth constant.
+
+# See also
+llvm::ConstantPtrAuth::getKey
+"""
+function LLVMGetConstantPtrAuthKey(PtrAuth)
+    ccall((:LLVMGetConstantPtrAuthKey, libllvm), LLVMValueRef, (LLVMValueRef,), PtrAuth)
+end
+
+"""
+    LLVMGetConstantPtrAuthDiscriminator(PtrAuth)
+
+Get the discriminator value for the associated ConstantPtrAuth constant.
+
+# See also
+llvm::ConstantPtrAuth::getDiscriminator
+"""
+function LLVMGetConstantPtrAuthDiscriminator(PtrAuth)
+    ccall((:LLVMGetConstantPtrAuthDiscriminator, libllvm), LLVMValueRef, (LLVMValueRef,), PtrAuth)
+end
+
+"""
+    LLVMGetConstantPtrAuthAddrDiscriminator(PtrAuth)
+
+Get the address discriminator value for the associated ConstantPtrAuth constant.
+
+# See also
+llvm::ConstantPtrAuth::getAddrDiscriminator
+"""
+function LLVMGetConstantPtrAuthAddrDiscriminator(PtrAuth)
+    ccall((:LLVMGetConstantPtrAuthAddrDiscriminator, libllvm), LLVMValueRef, (LLVMValueRef,), PtrAuth)
+end
+
+"""
     LLVMVoidTypeInContext(C)
 
 Create a void type in a context.
@@ -2588,6 +2689,66 @@
 end
 
 """
+    LLVMGetTargetExtTypeName(TargetExtTy)
+
+Obtain the name for this target extension type.
+
+# See also
+llvm::TargetExtType::getName()
+"""
+function LLVMGetTargetExtTypeName(TargetExtTy)
+    ccall((:LLVMGetTargetExtTypeName, libllvm), Cstring, (LLVMTypeRef,), TargetExtTy)
+end
+
+"""
+    LLVMGetTargetExtTypeNumTypeParams(TargetExtTy)
+
+Obtain the number of type parameters for this target extension type.
+
+# See also
+llvm::TargetExtType::getNumTypeParameters()
+"""
+function LLVMGetTargetExtTypeNumTypeParams(TargetExtTy)
+    ccall((:LLVMGetTargetExtTypeNumTypeParams, libllvm), Cuint, (LLVMTypeRef,), TargetExtTy)
+end
+
+"""
+    LLVMGetTargetExtTypeTypeParam(TargetExtTy, Idx)
+
+Get the type parameter at the given index for the target extension type.
+
+# See also
+llvm::TargetExtType::getTypeParameter()
+"""
+function LLVMGetTargetExtTypeTypeParam(TargetExtTy, Idx)
+    ccall((:LLVMGetTargetExtTypeTypeParam, libllvm), LLVMTypeRef, (LLVMTypeRef, Cuint), TargetExtTy, Idx)
+end
+
+"""
+    LLVMGetTargetExtTypeNumIntParams(TargetExtTy)
+
+Obtain the number of int parameters for this target extension type.
+
+# See also
+llvm::TargetExtType::getNumIntParameters()
+"""
+function LLVMGetTargetExtTypeNumIntParams(TargetExtTy)
+    ccall((:LLVMGetTargetExtTypeNumIntParams, libllvm), Cuint, (LLVMTypeRef,), TargetExtTy)
+end
+
+"""
+    LLVMGetTargetExtTypeIntParam(TargetExtTy, Idx)
+
+Get the int parameter at the given index for the target extension type.
+
+# See also
+llvm::TargetExtType::getIntParameter()
+"""
+function LLVMGetTargetExtTypeIntParam(TargetExtTy, Idx)
+    ccall((:LLVMGetTargetExtTypeIntParam, libllvm), Cuint, (LLVMTypeRef, Cuint), TargetExtTy, Idx)
+end
+
+"""
     LLVMTypeOf(Val)
 
 Obtain the type of a value.
@@ -2660,6 +2821,24 @@
 end
 
 """
+# See also
+llvm::DbgRecord
+"""
+const LLVMDbgRecordRef = Ptr{LLVMOpaqueDbgRecord}
+
+"""
+    LLVMPrintDbgRecordToString(Record)
+
+Return a string representation of the DbgRecord. Use [`LLVMDisposeMessage`](@ref) to free the string.
+
+# See also
+llvm::DbgRecord::print()
+"""
+function LLVMPrintDbgRecordToString(Record)
+    ccall((:LLVMPrintDbgRecordToString, libllvm), Cstring, (LLVMDbgRecordRef,), Record)
+end
+
+"""
     LLVMReplaceAllUsesWith(OldVal, NewVal)
 
 Replace all uses of a value with another one.
@@ -2770,6 +2949,10 @@
     ccall((:LLVMIsAConstantVector, libllvm), LLVMValueRef, (LLVMValueRef,), Val)
 end
 
+function LLVMIsAConstantPtrAuth(Val)
+    ccall((:LLVMIsAConstantPtrAuth, libllvm), LLVMValueRef, (LLVMValueRef,), Val)
+end
+
 function LLVMIsAGlobalValue(Val)
     ccall((:LLVMIsAGlobalValue, libllvm), LLVMValueRef, (LLVMValueRef,), Val)
 end
@@ -3384,6 +3567,10 @@
 
 Create a ConstantDataSequential and initialize it with a string.
 
+!!! compat "Deprecated"
+
+    [`LLVMConstStringInContext`](@ref) is deprecated in favor of the API accurate [`LLVMConstStringInContext2`](@ref)
+
 # See also
 llvm::ConstantDataArray::getString()
 """
@@ -3392,6 +3579,18 @@
 end
 
 """
+    LLVMConstStringInContext2(C, Str, Length, DontNullTerminate)
+
+Create a ConstantDataSequential and initialize it with a string.
+
+# See also
+llvm::ConstantDataArray::getString()
+"""
+function LLVMConstStringInContext2(C, Str, Length, DontNullTerminate)
+    ccall((:LLVMConstStringInContext2, libllvm), LLVMValueRef, (LLVMContextRef, Cstring, Csize_t, LLVMBool), C, Str, Length, DontNullTerminate)
+end
+
+"""
     LLVMConstString(Str, Length, DontNullTerminate)
 
 Create a ConstantDataSequential with string content in the global context.
@@ -3524,6 +3723,18 @@
 end
 
 """
+    LLVMConstantPtrAuth(Ptr, Key, Disc, AddrDisc)
+
+Create a ConstantPtrAuth constant with the given values.
+
+# See also
+llvm::ConstantPtrAuth::get()
+"""
+function LLVMConstantPtrAuth(Ptr, Key, Disc, AddrDisc)
+    ccall((:LLVMConstantPtrAuth, libllvm), LLVMValueRef, (LLVMValueRef, LLVMValueRef, LLVMValueRef, LLVMValueRef), Ptr, Key, Disc, AddrDisc)
+end
+
+"""
     LLVMGetConstOpcode(ConstantVal)
 
 ` LLVMCCoreValueConstantExpressions Constant Expressions`
@@ -3603,18 +3814,6 @@
     ccall((:LLVMConstXor, libllvm), LLVMValueRef, (LLVMValueRef, LLVMValueRef), LHSConstant, RHSConstant)
 end
 
-function LLVMConstICmp(Predicate, LHSConstant, RHSConstant)
-    ccall((:LLVMConstICmp, libllvm), LLVMValueRef, (LLVMIntPredicate, LLVMValueRef, LLVMValueRef), Predicate, LHSConstant, RHSConstant)
-end
-
-function LLVMConstFCmp(Predicate, LHSConstant, RHSConstant)
-    ccall((:LLVMConstFCmp, libllvm), LLVMValueRef, (LLVMRealPredicate, LLVMValueRef, LLVMValueRef), Predicate, LHSConstant, RHSConstant)
-end
-
-function LLVMConstShl(LHSConstant, RHSConstant)
-    ccall((:LLVMConstShl, libllvm), LLVMValueRef, (LLVMValueRef, LLVMValueRef), LHSConstant, RHSConstant)
-end
-
 function LLVMConstGEP2(Ty, ConstantVal, ConstantIndices, NumIndices)
     ccall((:LLVMConstGEP2, libllvm), LLVMValueRef, (LLVMTypeRef, LLVMValueRef, Ptr{LLVMValueRef}, Cuint), Ty, ConstantVal, ConstantIndices, NumIndices)
 end
@@ -3623,6 +3822,18 @@
     ccall((:LLVMConstInBoundsGEP2, libllvm), LLVMValueRef, (LLVMTypeRef, LLVMValueRef, Ptr{LLVMValueRef}, Cuint), Ty, ConstantVal, ConstantIndices, NumIndices)
 end
 
+"""
+    LLVMConstGEPWithNoWrapFlags(Ty, ConstantVal, ConstantIndices, NumIndices, NoWrapFlags)
+
+Creates a constant GetElementPtr expression. Similar to [`LLVMConstGEP2`](@ref), but allows specifying the no-wrap flags.
+
+# See also
+llvm::ConstantExpr::getGetElementPtr()
+"""
+function LLVMConstGEPWithNoWrapFlags(Ty, ConstantVal, ConstantIndices, NumIndices, NoWrapFlags)
+    ccall((:LLVMConstGEPWithNoWrapFlags, libllvm), LLVMValueRef, (LLVMTypeRef, LLVMValueRef, Ptr{LLVMValueRef}, Cuint, LLVMGEPNoWrapFlags), Ty, ConstantVal, ConstantIndices, NumIndices, NoWrapFlags)
+end
+
 function LLVMConstTrunc(ConstantVal, ToType)
     ccall((:LLVMConstTrunc, libllvm), LLVMValueRef, (LLVMValueRef, LLVMTypeRef), ConstantVal, ToType)
 end
@@ -3675,6 +3886,24 @@
 end
 
 """
+    LLVMGetBlockAddressFunction(BlockAddr)
+
+Gets the function associated with a given BlockAddress constant value.
+"""
+function LLVMGetBlockAddressFunction(BlockAddr)
+    ccall((:LLVMGetBlockAddressFunction, libllvm), LLVMValueRef, (LLVMValueRef,), BlockAddr)
+end
+
+"""
+    LLVMGetBlockAddressBasicBlock(BlockAddr)
+
+Gets the basic block associated with a given BlockAddress constant value.
+"""
+function LLVMGetBlockAddressBasicBlock(BlockAddr)
+    ccall((:LLVMGetBlockAddressBasicBlock, libllvm), LLVMBasicBlockRef, (LLVMValueRef,), BlockAddr)
+end
+
+"""
     LLVMConstInlineAsm(Ty, AsmString, Constraints, HasSideEffects, IsAlignStack)
 
 Deprecated: Use [`LLVMGetInlineAsm`](@ref) instead.
@@ -4252,6 +4481,60 @@
 end
 
 """
+    LLVMGetPrefixData(Fn)
+
+Gets the prefix data associated with a function. Only valid on functions, and only if [`LLVMHasPrefixData`](@ref) returns true. See https://llvm.org/docs/LangRef.html#prefix-data
+"""
+function LLVMGetPrefixData(Fn)
+    ccall((:LLVMGetPrefixData, libllvm), LLVMValueRef, (LLVMValueRef,), Fn)
+end
+
+"""
+    LLVMHasPrefixData(Fn)
+
+Check if a given function has prefix data. Only valid on functions. See https://llvm.org/docs/LangRef.html#prefix-data
+"""
+function LLVMHasPrefixData(Fn)
+    ccall((:LLVMHasPrefixData, libllvm), LLVMBool, (LLVMValueRef,), Fn)
+end
+
+"""
+    LLVMSetPrefixData(Fn, prefixData)
+
+Sets the prefix data for the function. Only valid on functions. See https://llvm.org/docs/LangRef.html#prefix-data
+"""
+function LLVMSetPrefixData(Fn, prefixData)
+    ccall((:LLVMSetPrefixData, libllvm), Cvoid, (LLVMValueRef, LLVMValueRef), Fn, prefixData)
+end
+
+"""
+    LLVMGetPrologueData(Fn)
+
+Gets the prologue data associated with a function. Only valid on functions, and only if [`LLVMHasPrologueData`](@ref) returns true. See https://llvm.org/docs/LangRef.html#prologue-data
+"""
+function LLVMGetPrologueData(Fn)
+    ccall((:LLVMGetPrologueData, libllvm), LLVMValueRef, (LLVMValueRef,), Fn)
+end
+
+"""
+    LLVMHasPrologueData(Fn)
+
+Check if a given function has prologue data. Only valid on functions. See https://llvm.org/docs/LangRef.html#prologue-data
+"""
+function LLVMHasPrologueData(Fn)
+    ccall((:LLVMHasPrologueData, libllvm), LLVMBool, (LLVMValueRef,), Fn)
+end
+
+"""
+    LLVMSetPrologueData(Fn, prologueData)
+
+Sets the prologue data for the function. Only valid on functions. See https://llvm.org/docs/LangRef.html#prologue-data
+"""
+function LLVMSetPrologueData(Fn, prologueData)
+    ccall((:LLVMSetPrologueData, libllvm), Cvoid, (LLVMValueRef, LLVMValueRef), Fn, prologueData)
+end
+
+"""
     LLVMAddAttributeAtIndex(F, Idx, A)
 
 Add an attribute to a function.
@@ -5196,7 +5479,7 @@
 
 Obtain the predicate of an instruction.
 
-This is only valid for instructions that correspond to llvm::ICmpInst or llvm::ConstantExpr whose opcode is llvm::Instruction::ICmp.
+This is only valid for instructions that correspond to llvm::ICmpInst.
 
 # See also
 llvm::ICmpInst::getPredicate()
@@ -5210,7 +5493,7 @@
 
 Obtain the float predicate of an instruction.
 
-This is only valid for instructions that correspond to llvm::FCmpInst or llvm::ConstantExpr whose opcode is llvm::Instruction::FCmp.
+This is only valid for instructions that correspond to llvm::FCmpInst.
 
 # See also
 llvm::FCmpInst::getPredicate()
@@ -5477,6 +5760,42 @@
 end
 
 """
+    LLVMGetCallBrDefaultDest(CallBr)
+
+Get the default destination of a CallBr instruction.
+
+# See also
+llvm::CallBrInst::getDefaultDest()
+"""
+function LLVMGetCallBrDefaultDest(CallBr)
+    ccall((:LLVMGetCallBrDefaultDest, libllvm), LLVMBasicBlockRef, (LLVMValueRef,), CallBr)
+end
+
+"""
+    LLVMGetCallBrNumIndirectDests(CallBr)
+
+Get the number of indirect destinations of a CallBr instruction.
+
+# See also
+llvm::CallBrInst::getNumIndirectDests()
+"""
+function LLVMGetCallBrNumIndirectDests(CallBr)
+    ccall((:LLVMGetCallBrNumIndirectDests, libllvm), Cuint, (LLVMValueRef,), CallBr)
+end
+
+"""
+    LLVMGetCallBrIndirectDest(CallBr, Idx)
+
+Get the indirect destination of a CallBr instruction at the given index.
+
+# See also
+llvm::CallBrInst::getIndirectDest()
+"""
+function LLVMGetCallBrIndirectDest(CallBr, Idx)
+    ccall((:LLVMGetCallBrIndirectDest, libllvm), LLVMBasicBlockRef, (LLVMValueRef, Cuint), CallBr, Idx)
+end
+
+"""
     LLVMGetNumSuccessors(Term)
 
 Return the number of successors that this terminator has.
@@ -5605,6 +5924,30 @@
 end
 
 """
+    LLVMGEPGetNoWrapFlags(GEP)
+
+Get the no-wrap related flags for the given GEP instruction.
+
+# See also
+llvm::GetElementPtrInst::getNoWrapFlags
+"""
+function LLVMGEPGetNoWrapFlags(GEP)
+    ccall((:LLVMGEPGetNoWrapFlags, libllvm), LLVMGEPNoWrapFlags, (LLVMValueRef,), GEP)
+end
+
+"""
+    LLVMGEPSetNoWrapFlags(GEP, NoWrapFlags)
+
+Set the no-wrap related flags for the given GEP instruction.
+
+# See also
+llvm::GetElementPtrInst::setNoWrapFlags
+"""
+function LLVMGEPSetNoWrapFlags(GEP, NoWrapFlags)
+    ccall((:LLVMGEPSetNoWrapFlags, libllvm), Cvoid, (LLVMValueRef, LLVMGEPNoWrapFlags), GEP, NoWrapFlags)
+end
+
+"""
     LLVMAddIncoming(PhiNode, IncomingValues, IncomingBlocks, Count)
 
 Add an incoming value to the end of a PHI list.
@@ -5675,14 +6018,42 @@
     ccall((:LLVMCreateBuilder, libllvm), LLVMBuilderRef, ())
 end
 
+"""
+    LLVMPositionBuilder(Builder, Block, Instr)
+
+Set the builder position before Instr but after any attached debug records, or if Instr is null set the position to the end of Block.
+"""
 function LLVMPositionBuilder(Builder, Block, Instr)
     ccall((:LLVMPositionBuilder, libllvm), Cvoid, (LLVMBuilderRef, LLVMBasicBlockRef, LLVMValueRef), Builder, Block, Instr)
 end
 
+"""
+    LLVMPositionBuilderBeforeDbgRecords(Builder, Block, Inst)
+
+Set the builder position before Instr and any attached debug records, or if Instr is null set the position to the end of Block.
+"""
+function LLVMPositionBuilderBeforeDbgRecords(Builder, Block, Inst)
+    ccall((:LLVMPositionBuilderBeforeDbgRecords, libllvm), Cvoid, (LLVMBuilderRef, LLVMBasicBlockRef, LLVMValueRef), Builder, Block, Inst)
+end
+
+"""
+    LLVMPositionBuilderBefore(Builder, Instr)
+
+Set the builder position before Instr but after any attached debug records.
+"""
 function LLVMPositionBuilderBefore(Builder, Instr)
     ccall((:LLVMPositionBuilderBefore, libllvm), Cvoid, (LLVMBuilderRef, LLVMValueRef), Builder, Instr)
 end
 
+"""
+    LLVMPositionBuilderBeforeInstrAndDbgRecords(Builder, Instr)
+
+Set the builder position before Instr and any attached debug records.
+"""
+function LLVMPositionBuilderBeforeInstrAndDbgRecords(Builder, Instr)
+    ccall((:LLVMPositionBuilderBeforeInstrAndDbgRecords, libllvm), Cvoid, (LLVMBuilderRef, LLVMValueRef), Builder, Instr)
+end
+
 function LLVMPositionBuilderAtEnd(Builder, Block)
     ccall((:LLVMPositionBuilderAtEnd, libllvm), Cvoid, (LLVMBuilderRef, LLVMBasicBlockRef), Builder, Block)
 end
@@ -5833,6 +6204,10 @@
     ccall((:LLVMBuildIndirectBr, libllvm), LLVMValueRef, (LLVMBuilderRef, LLVMValueRef, Cuint), B, Addr, NumDests)
 end
 
+function LLVMBuildCallBr(B, Ty, Fn, DefaultDest, IndirectDests, NumIndirectDests, Args, NumArgs, Bundles, NumBundles, Name)
+    ccall((:LLVMBuildCallBr, libllvm), LLVMValueRef, (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, LLVMBasicBlockRef, Ptr{LLVMBasicBlockRef}, Cuint, Ptr{LLVMValueRef}, Cuint, Ptr{LLVMOperandBundleRef}, Cuint, Cstring), B, Ty, Fn, DefaultDest, IndirectDests, NumIndirectDests, Args, NumArgs, Bundles, NumBundles, Name)
+end
+
 function LLVMBuildInvoke2(arg1, Ty, Fn, Args, NumArgs, Then, Catch, Name)
     ccall((:LLVMBuildInvoke2, libllvm), LLVMValueRef, (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, Ptr{LLVMValueRef}, Cuint, LLVMBasicBlockRef, LLVMBasicBlockRef, Cstring), arg1, Ty, Fn, Args, NumArgs, Then, Catch, Name)
 end
@@ -6259,6 +6634,18 @@
     ccall((:LLVMBuildInBoundsGEP2, libllvm), LLVMValueRef, (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, Ptr{LLVMValueRef}, Cuint, Cstring), B, Ty, Pointer, Indices, NumIndices, Name)
 end
 
+"""
+    LLVMBuildGEPWithNoWrapFlags(B, Ty, Pointer, Indices, NumIndices, Name, NoWrapFlags)
+
+Creates a GetElementPtr instruction. Similar to [`LLVMBuildGEP2`](@ref), but allows specifying the no-wrap flags.
+
+# See also
+llvm::IRBuilder::CreateGEP()
+"""
+function LLVMBuildGEPWithNoWrapFlags(B, Ty, Pointer, Indices, NumIndices, Name, NoWrapFlags)
+    ccall((:LLVMBuildGEPWithNoWrapFlags, libllvm), LLVMValueRef, (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, Ptr{LLVMValueRef}, Cuint, Cstring, LLVMGEPNoWrapFlags), B, Ty, Pointer, Indices, NumIndices, Name, NoWrapFlags)
+end
+
 function LLVMBuildStructGEP2(B, Ty, Pointer, Idx, Name)
     ccall((:LLVMBuildStructGEP2, libllvm), LLVMValueRef, (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, Cuint, Cstring), B, Ty, Pointer, Idx, Name)
 end
@@ -6809,10 +7196,22 @@
     LLVMDWARFSourceLanguageFortran18 = 43
     LLVMDWARFSourceLanguageAda2005 = 44
     LLVMDWARFSourceLanguageAda2012 = 45
-    LLVMDWARFSourceLanguageMojo = 46
-    LLVMDWARFSourceLanguageMips_Assembler = 47
-    LLVMDWARFSourceLanguageGOOGLE_RenderScript = 48
-    LLVMDWARFSourceLanguageBORLAND_Delphi = 49
+    LLVMDWARFSourceLanguageHIP = 46
+    LLVMDWARFSourceLanguageAssembly = 47
+    LLVMDWARFSourceLanguageC_sharp = 48
+    LLVMDWARFSourceLanguageMojo = 49
+    LLVMDWARFSourceLanguageGLSL = 50
+    LLVMDWARFSourceLanguageGLSL_ES = 51
+    LLVMDWARFSourceLanguageHLSL = 52
+    LLVMDWARFSourceLanguageOpenCL_CPP = 53
+    LLVMDWARFSourceLanguageCPP_for_OpenCL = 54
+    LLVMDWARFSourceLanguageSYCL = 55
+    LLVMDWARFSourceLanguageRuby = 56
+    LLVMDWARFSourceLanguageMove = 57
+    LLVMDWARFSourceLanguageHylo = 58
+    LLVMDWARFSourceLanguageMips_Assembler = 59
+    LLVMDWARFSourceLanguageGOOGLE_RenderScript = 60
+    LLVMDWARFSourceLanguageBORLAND_Delphi = 61
 end
 
 """
@@ -6827,11 +7226,11 @@
 end
 
 """
-    __JL_Ctag_117
+    __JL_Ctag_4
 
 The kind of metadata nodes.
 """
-@cenum __JL_Ctag_117::UInt32 begin
+@cenum __JL_Ctag_4::UInt32 begin
     LLVMMDStringMetadataKind = 0
     LLVMConstantAsMetadataMetadataKind = 1
     LLVMLocalAsMetadataMetadataKind = 2
@@ -8165,9 +8564,13 @@
 end
 
 """
-    LLVMDIBuilderInsertDeclareBefore(Builder, Storage, VarInfo, Expr, DebugLoc, Instr)
+    LLVMDIBuilderInsertDeclareRecordBefore(Builder, Storage, VarInfo, Expr, DebugLoc, Instr)
 
-Insert a new llvm.dbg.declare intrinsic call before the given instruction.
+Only use in "new debug format" ([`LLVMIsNewDbgInfoFormat`](@ref)() is true). See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
+
+The debug format can be switched later after inserting the records using [`LLVMSetIsNewDbgInfoFormat`](@ref), if needed for legacy or transitionary reasons.
+
+Insert a Declare DbgRecord before the given instruction.
 
 # Arguments
 * `Builder`: The DIBuilder.
@@ -8175,16 +8578,20 @@
 * `VarInfo`: The variable's debug info descriptor.
 * `Expr`: A complex location expression for the variable.
 * `DebugLoc`: Debug info location.
-* `Instr`: Instruction acting as a location for the new intrinsic.
+* `Instr`: Instruction acting as a location for the new record.
 """
-function LLVMDIBuilderInsertDeclareBefore(Builder, Storage, VarInfo, Expr, DebugLoc, Instr)
-    ccall((:LLVMDIBuilderInsertDeclareBefore, libllvm), LLVMValueRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef), Builder, Storage, VarInfo, Expr, DebugLoc, Instr)
+function LLVMDIBuilderInsertDeclareRecordBefore(Builder, Storage, VarInfo, Expr, DebugLoc, Instr)
+    ccall((:LLVMDIBuilderInsertDeclareRecordBefore, libllvm), LLVMDbgRecordRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef), Builder, Storage, VarInfo, Expr, DebugLoc, Instr)
 end
 
 """
-    LLVMDIBuilderInsertDeclareAtEnd(Builder, Storage, VarInfo, Expr, DebugLoc, Block)
+    LLVMDIBuilderInsertDeclareRecordAtEnd(Builder, Storage, VarInfo, Expr, DebugLoc, Block)
+
+Only use in "new debug format" ([`LLVMIsNewDbgInfoFormat`](@ref)() is true). See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
 
-Insert a new llvm.dbg.declare intrinsic call at the end of the given basic block. If the basic block has a terminator instruction, the intrinsic is inserted before that terminator instruction.
+The debug format can be switched later after inserting the records using [`LLVMSetIsNewDbgInfoFormat`](@ref), if needed for legacy or transitionary reasons.
+
+Insert a Declare DbgRecord at the end of the given basic block. If the basic block has a terminator instruction, the record is inserted before that terminator instruction.
 
 # Arguments
 * `Builder`: The DIBuilder.
@@ -8192,16 +8599,20 @@
 * `VarInfo`: The variable's debug info descriptor.
 * `Expr`: A complex location expression for the variable.
 * `DebugLoc`: Debug info location.
-* `Block`: Basic block acting as a location for the new intrinsic.
+* `Block`: Basic block acting as a location for the new record.
 """
-function LLVMDIBuilderInsertDeclareAtEnd(Builder, Storage, VarInfo, Expr, DebugLoc, Block)
-    ccall((:LLVMDIBuilderInsertDeclareAtEnd, libllvm), LLVMValueRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef), Builder, Storage, VarInfo, Expr, DebugLoc, Block)
+function LLVMDIBuilderInsertDeclareRecordAtEnd(Builder, Storage, VarInfo, Expr, DebugLoc, Block)
+    ccall((:LLVMDIBuilderInsertDeclareRecordAtEnd, libllvm), LLVMDbgRecordRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef), Builder, Storage, VarInfo, Expr, DebugLoc, Block)
 end
 
 """
-    LLVMDIBuilderInsertDbgValueBefore(Builder, Val, VarInfo, Expr, DebugLoc, Instr)
+    LLVMDIBuilderInsertDbgValueRecordBefore(Builder, Val, VarInfo, Expr, DebugLoc, Instr)
+
+Only use in "new debug format" ([`LLVMIsNewDbgInfoFormat`](@ref)() is true). See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
 
-Insert a new llvm.dbg.value intrinsic call before the given instruction.
+The debug format can be switched later after inserting the records using [`LLVMSetIsNewDbgInfoFormat`](@ref), if needed for legacy or transitionary reasons.
+
+Insert a new debug record before the given instruction.
 
 # Arguments
 * `Builder`: The DIBuilder.
@@ -8209,16 +8620,20 @@
 * `VarInfo`: The variable's debug info descriptor.
 * `Expr`: A complex location expression for the variable.
 * `DebugLoc`: Debug info location.
-* `Instr`: Instruction acting as a location for the new intrinsic.
+* `Instr`: Instruction acting as a location for the new record.
 """
-function LLVMDIBuilderInsertDbgValueBefore(Builder, Val, VarInfo, Expr, DebugLoc, Instr)
-    ccall((:LLVMDIBuilderInsertDbgValueBefore, libllvm), LLVMValueRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef), Builder, Val, VarInfo, Expr, DebugLoc, Instr)
+function LLVMDIBuilderInsertDbgValueRecordBefore(Builder, Val, VarInfo, Expr, DebugLoc, Instr)
+    ccall((:LLVMDIBuilderInsertDbgValueRecordBefore, libllvm), LLVMDbgRecordRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef), Builder, Val, VarInfo, Expr, DebugLoc, Instr)
 end
 
 """
-    LLVMDIBuilderInsertDbgValueAtEnd(Builder, Val, VarInfo, Expr, DebugLoc, Block)
+    LLVMDIBuilderInsertDbgValueRecordAtEnd(Builder, Val, VarInfo, Expr, DebugLoc, Block)
+
+Only use in "new debug format" ([`LLVMIsNewDbgInfoFormat`](@ref)() is true). See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
 
-Insert a new llvm.dbg.value intrinsic call at the end of the given basic block. If the basic block has a terminator instruction, the intrinsic is inserted before that terminator instruction.
+The debug format can be switched later after inserting the records using [`LLVMSetIsNewDbgInfoFormat`](@ref), if needed for legacy or transitionary reasons.
+
+Insert a new debug record at the end of the given basic block. If the basic block has a terminator instruction, the record is inserted before that terminator instruction.
 
 # Arguments
 * `Builder`: The DIBuilder.
@@ -8226,10 +8641,10 @@
 * `VarInfo`: The variable's debug info descriptor.
 * `Expr`: A complex location expression for the variable.
 * `DebugLoc`: Debug info location.
-* `Block`: Basic block acting as a location for the new intrinsic.
+* `Block`: Basic block acting as a location for the new record.
 """
-function LLVMDIBuilderInsertDbgValueAtEnd(Builder, Val, VarInfo, Expr, DebugLoc, Block)
-    ccall((:LLVMDIBuilderInsertDbgValueAtEnd, libllvm), LLVMValueRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef), Builder, Val, VarInfo, Expr, DebugLoc, Block)
+function LLVMDIBuilderInsertDbgValueRecordAtEnd(Builder, Val, VarInfo, Expr, DebugLoc, Block)
+    ccall((:LLVMDIBuilderInsertDbgValueRecordAtEnd, libllvm), LLVMDbgRecordRef, (LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef), Builder, Val, VarInfo, Expr, DebugLoc, Block)
 end
 
 """
@@ -9552,6 +9967,17 @@
 const LLVMOrcCDependenceMapPairs = Ptr{LLVMOrcCDependenceMapPair}
 
 """
+    LLVMOrcCSymbolDependenceGroup
+
+A set of symbols that share dependencies.
+"""
+struct LLVMOrcCSymbolDependenceGroup
+    Symbols::LLVMOrcCSymbolsList
+    Dependencies::LLVMOrcCDependenceMapPairs
+    NumDependencies::Csize_t
+end
+
+"""
     LLVMOrcLookupKind
 
 Lookup kind. This can be used by definition generators when deciding whether to produce a definition for a requested symbol.
@@ -10064,14 +10490,22 @@
 end
 
 """
-    LLVMOrcMaterializationResponsibilityNotifyEmitted(MR)
+    LLVMOrcMaterializationResponsibilityNotifyEmitted(MR, SymbolDepGroups, NumSymbolDepGroups)
 
 Notifies the target JITDylib (and any pending queries on that JITDylib) that all symbols covered by this MaterializationResponsibility instance have been emitted.
 
+This function takes ownership of the symbols in the Dependencies struct. This allows the following pattern...
+
+[`LLVMOrcSymbolStringPoolEntryRef`](@ref) Names[] = {...}; [`LLVMOrcCDependenceMapPair`](@ref) Dependence = {JD, {Names, sizeof(Names)}} LLVMOrcMaterializationResponsibilityAddDependencies(JD, Name, &Dependence, 1);
+
+... without requiring cleanup of the elements of the Names array afterwards.
+
+The client is still responsible for deleting the Dependencies.Names arrays, and the Dependencies array itself.
+
 This method will return an error if any symbols being resolved have been moved to the error state due to the failure of a dependency. If this method returns an error then clients should log it and call [`LLVMOrcMaterializationResponsibilityFailMaterialization`](@ref). If no dependencies have been registered for the symbols covered by this MaterializationResponsibility then this method is guaranteed to return [`LLVMErrorSuccess`](@ref).
 """
-function LLVMOrcMaterializationResponsibilityNotifyEmitted(MR)
-    ccall((:LLVMOrcMaterializationResponsibilityNotifyEmitted, libllvm), LLVMErrorRef, (LLVMOrcMaterializationResponsibilityRef,), MR)
+function LLVMOrcMaterializationResponsibilityNotifyEmitted(MR, SymbolDepGroups, NumSymbolDepGroups)
+    ccall((:LLVMOrcMaterializationResponsibilityNotifyEmitted, libllvm), LLVMErrorRef, (LLVMOrcMaterializationResponsibilityRef, Ptr{LLVMOrcCSymbolDependenceGroup}, Csize_t), MR, SymbolDepGroups, NumSymbolDepGroups)
 end
 
 """
@@ -10115,32 +10549,6 @@
 end
 
 """
-    LLVMOrcMaterializationResponsibilityAddDependencies(MR, Name, Dependencies, NumPairs)
-
-Adds dependencies to a symbol that the MaterializationResponsibility is responsible for.
-
-This function takes ownership of Dependencies struct. The Names array have been retained for this function. This allows the following pattern...
-
-[`LLVMOrcSymbolStringPoolEntryRef`](@ref) Names[] = {...}; [`LLVMOrcCDependenceMapPair`](@ref) Dependence = {JD, {Names, sizeof(Names)}} [`LLVMOrcMaterializationResponsibilityAddDependencies`](@ref)(JD, Name, &Dependence, 1);
-
-... without requiring cleanup of the elements of the Names array afterwards.
-
-The client is still responsible for deleting the Dependencies.Names array itself.
-"""
-function LLVMOrcMaterializationResponsibilityAddDependencies(MR, Name, Dependencies, NumPairs)
-    ccall((:LLVMOrcMaterializationResponsibilityAddDependencies, libllvm), Cvoid, (LLVMOrcMaterializationResponsibilityRef, LLVMOrcSymbolStringPoolEntryRef, LLVMOrcCDependenceMapPairs, Csize_t), MR, Name, Dependencies, NumPairs)
-end
-
-"""
-    LLVMOrcMaterializationResponsibilityAddDependenciesForAll(MR, Dependencies, NumPairs)
-
-Adds dependencies to all symbols that the MaterializationResponsibility is responsible for. See [`LLVMOrcMaterializationResponsibilityAddDependencies`](@ref) for notes about memory responsibility.
-"""
-function LLVMOrcMaterializationResponsibilityAddDependenciesForAll(MR, Dependencies, NumPairs)
-    ccall((:LLVMOrcMaterializationResponsibilityAddDependenciesForAll, libllvm), Cvoid, (LLVMOrcMaterializationResponsibilityRef, LLVMOrcCDependenceMapPairs, Csize_t), MR, Dependencies, NumPairs)
-end
-
-"""
     LLVMOrcExecutionSessionCreateBareJITDylib(ES, Name)
 
 Create a "bare" JITDylib.

@maleadt
Copy link
Collaborator

maleadt commented Jan 21, 2025

This also needs adjusting, or it won't use the wrappers:

LLVM.jl/src/LLVM.jl

Lines 42 to 44 in ef63865

dir = if version().major > 18
@warn "LLVM.jl has not been tested with LLVM versions newer than 18."
joinpath(@__DIR__, "..", "lib", "18")

@yuyichao
Copy link
Contributor Author

Version check is updated and so is the constant expression wrapper code.

@maleadt
Copy link
Collaborator

maleadt commented Jan 21, 2025

Great, thanks. Testing on JuliaLang/julia#56130, there's a couple of test failures though:

Error in testset "debuginfo" on worker 836901:
Error During Test at /home/tim/Julia/pkg/LLVM/test/debuginfo_tests.jl:1
  Got exception outside of a @test
  TypeError: in typeassert, expected LLVM.DILocalVariable, got a value of type LLVM.LocalAsMetadata
  Stacktrace:
    [1] top-level scope
      @ ~/Julia/pkg/LLVM/src/base.jl:97
    [2] macro expansion
      @ ~/Julia/pkg/LLVM/test/debuginfo_tests.jl:76 [inlined]

Error in testset "function" on worker 836902:
Error During Test at /home/tim/Julia/pkg/LLVM/test/newpm_tests.jl:144
  Test threw exception
  Expression: run!(pb, mod) === nothing
  LLVM error: unknown pass name 'flattencfg'

Error in testset "function" on worker 836902:
Error During Test at /home/tim/Julia/pkg/LLVM/test/newpm_tests.jl:151
  Test threw exception
  Expression: run!(pb, mod) === nothing
  LLVM error: unknown function pass 'flattencfg'

Error in testset "function" on worker 836902:
Error During Test at /home/tim/Julia/pkg/LLVM/test/newpm_tests.jl:144
  Test threw exception
  Expression: run!(pb, mod) === nothing
  LLVM error: unknown pass name 'loweratomic'

Error in testset "function" on worker 836902:
Error During Test at /home/tim/Julia/pkg/LLVM/test/newpm_tests.jl:144
  Test threw exception
  Expression: run!(pb, mod) === nothing
  LLVM error: unknown pass name 'lowerinvoke'

Error in testset "function" on worker 836902:
Error During Test at /home/tim/Julia/pkg/LLVM/test/newpm_tests.jl:144
  Test threw exception
  Expression: run!(pb, mod) === nothing
  LLVM error: unknown pass name 'lowerswitch'

Error in testset "loop" on worker 836902:
Error During Test at /home/tim/Julia/pkg/LLVM/test/newpm_tests.jl:151
  Test threw exception
  Expression: run!(pb, mod) === nothing
  LLVM error: unknown loop pass 'loop-reroll'

None of those look related to the support library, so in the meantime I'll bump that on Yggdrasil.

@yuyichao
Copy link
Contributor Author

Those seems to be llvm/llvm-project@e390c22 ?

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.

2 participants