Better compatibility with LLVM < 13 (#319)

* Update wrapper to add type attribute on LLVM < 13
This commit is contained in:
Christoffer Lerno
2021-11-09 22:53:13 +01:00
committed by GitHub
parent 137b474f44
commit df0b1df1df
4 changed files with 19 additions and 9 deletions

View File

@@ -122,6 +122,7 @@ to C3 and compiled with the c3c compiler:
- [x] Subarray initializers - [x] Subarray initializers
- [x] `$switch` - [x] `$switch`
- [x] Windows support - [x] Windows support
- [x] Bitstructs
- [ ] Anonymous structs - [ ] Anonymous structs
- [ ] Complete C ABI conformance *in progress* - [ ] Complete C ABI conformance *in progress*
- [ ] Debug info *in progress* - [ ] Debug info *in progress*
@@ -133,7 +134,6 @@ to C3 and compiled with the c3c compiler:
- [ ] `global` / `shared` for globals - [ ] `global` / `shared` for globals
- [ ] Escape macros - [ ] Escape macros
- [ ] Implicit capturing macros - [ ] Implicit capturing macros
- [ ] Bitstructs
- [ ] `asm` section *in progress* - [ ] `asm` section *in progress*
- [ ] `$for` - [ ] `$for`
- [ ] Pre-post conditions - [ ] Pre-post conditions

View File

@@ -1100,11 +1100,7 @@ void llvm_attribute_add_int(GenContext *context, LLVMValueRef value_to_add_attri
void llvm_attribute_add_type(GenContext *c, LLVMValueRef value_to_add_attribute_to, unsigned attribute_id, LLVMTypeRef type, int index) void llvm_attribute_add_type(GenContext *c, LLVMValueRef value_to_add_attribute_to, unsigned attribute_id, LLVMTypeRef type, int index)
{ {
#if LLVM_VERSION_MAJOR < 13
LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(c->context, attribute_id, 0);
#else
LLVMAttributeRef llvm_attr = LLVMCreateTypeAttribute(c->context, attribute_id, type); LLVMAttributeRef llvm_attr = LLVMCreateTypeAttribute(c->context, attribute_id, type);
#endif
LLVMAddAttributeAtIndex(value_to_add_attribute_to, index, llvm_attr); LLVMAddAttributeAtIndex(value_to_add_attribute_to, index, llvm_attr);
} }
@@ -1115,11 +1111,7 @@ void llvm_attribute_add(GenContext *context, LLVMValueRef value_to_add_attribute
void llvm_attribute_add_call_type(GenContext *c, LLVMValueRef call, unsigned attribute_id, int index, LLVMTypeRef type) void llvm_attribute_add_call_type(GenContext *c, LLVMValueRef call, unsigned attribute_id, int index, LLVMTypeRef type)
{ {
#if LLVM_VERSION_MAJOR < 13
LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(c->context, attribute_id, 0);
#else
LLVMAttributeRef llvm_attr = LLVMCreateTypeAttribute(c->context, attribute_id, type); LLVMAttributeRef llvm_attr = LLVMCreateTypeAttribute(c->context, attribute_id, type);
#endif
LLVMAddCallSiteAttribute(call, index, llvm_attr); LLVMAddCallSiteAttribute(call, index, llvm_attr);
} }

View File

@@ -187,6 +187,10 @@ void gencontext_end_file_emit(GenContext *c, Context *ast);
void gencontext_end_module(GenContext *context); void gencontext_end_module(GenContext *context);
LLVMValueRef LLVMConstBswap(LLVMValueRef ConstantVal); LLVMValueRef LLVMConstBswap(LLVMValueRef ConstantVal);
#ifndef LLVMCreateTypeAttribute
LLVMAttributeRef LLVMCreateTypeAttribute(LLVMContextRef C, unsigned KindID,
LLVMTypeRef type_ref);
#endif
// BE value // BE value
void llvm_value_addr(GenContext *c, BEValue *value); void llvm_value_addr(GenContext *c, BEValue *value);

View File

@@ -111,6 +111,20 @@ static bool llvm_link(ObjFormat format, const char **args, int arg_count, const
extern "C" { extern "C" {
#if LLVM_VERSION_MAJOR < 13
#if _MSC_VER
__declspec(selectany)
#else
__attribute__((weak))
#endif
LLVMAttributeRef LLVMCreateTypeAttribute(LLVMContextRef C, unsigned KindID,
LLVMTypeRef type_ref)
{
auto &Ctx = *llvm::unwrap(C);
auto AttrKind = (llvm::Attribute::AttrKind)KindID;
return wrap(llvm::Attribute::get(Ctx, AttrKind, llvm::unwrap(type_ref)));
}
#endif
LLVMValueRef LLVMConstBswap(LLVMValueRef ConstantVal) LLVMValueRef LLVMConstBswap(LLVMValueRef ConstantVal)
{ {
llvm::Constant *Val = llvm::unwrap<llvm::Constant>(ConstantVal); llvm::Constant *Val = llvm::unwrap<llvm::Constant>(ConstantVal);