#include #include #include #include using namespace llvm; #define LLVM_VERSION_GE(major, minor) \ (LLVM_VERSION_MAJOR > (major) || LLVM_VERSION_MAJOR == (major) && LLVM_VERSION_MINOR >= (minor)) #if !LLVM_VERSION_GE(9, 0) #include #endif #if LLVM_VERSION_GE(16, 0) #define makeArrayRef ArrayRef #endif #if !LLVM_VERSION_GE(18, 0) typedef struct LLVMOpaqueOperandBundle *LLVMOperandBundleRef; DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OperandBundleDef, LLVMOperandBundleRef) #endif extern "C" { #if !LLVM_VERSION_GE(9, 0) LLVMMetadataRef LLVMExtDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, int64_t Value, LLVMBool IsUnsigned) { return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value, IsUnsigned != 0)); } void LLVMExtClearCurrentDebugLocation(LLVMBuilderRef B) { unwrap(B)->SetCurrentDebugLocation(DebugLoc::get(0, 0, nullptr)); } #endif #if !LLVM_VERSION_GE(18, 0) LLVMOperandBundleRef LLVMExtCreateOperandBundle(const char *Tag, size_t TagLen, LLVMValueRef *Args, unsigned NumArgs) { return wrap(new OperandBundleDef(std::string(Tag, TagLen), makeArrayRef(unwrap(Args), NumArgs))); } void LLVMExtDisposeOperandBundle(LLVMOperandBundleRef Bundle) { delete unwrap(Bundle); } LLVMValueRef LLVMExtBuildCallWithOperandBundles(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, LLVMOperandBundleRef *Bundles, unsigned NumBundles, const char *Name) { FunctionType *FTy = unwrap(Ty); SmallVector OBs; for (auto *Bundle : makeArrayRef(Bundles, NumBundles)) { OperandBundleDef *OB = unwrap(Bundle); OBs.push_back(*OB); } return wrap(unwrap(B)->CreateCall( FTy, unwrap(Fn), makeArrayRef(unwrap(Args), NumArgs), OBs, Name)); } LLVMValueRef LLVMExtBuildInvokeWithOperandBundles( LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, LLVMOperandBundleRef *Bundles, unsigned NumBundles, const char *Name) { SmallVector OBs; for (auto *Bundle : makeArrayRef(Bundles, NumBundles)) { OperandBundleDef *OB = unwrap(Bundle); OBs.push_back(*OB); } return wrap(unwrap(B)->CreateInvoke( unwrap(Ty), unwrap(Fn), unwrap(Then), unwrap(Catch), makeArrayRef(unwrap(Args), NumArgs), OBs, Name)); } #endif #if !LLVM_VERSION_GE(18, 0) static TargetMachine *unwrap(LLVMTargetMachineRef P) { return reinterpret_cast(P); } void LLVMExtSetTargetMachineGlobalISel(LLVMTargetMachineRef T, LLVMBool Enable) { unwrap(T)->setGlobalISel(Enable); } #endif } // extern "C"