From bc8fbdb54a8b2d865f83437501cd98e5dbb25b0e Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Tue, 25 Jan 2022 15:11:02 +0100 Subject: [PATCH] Fix LLVM 14 compatibility --- src/compiler/parse_global.c | 17 ++++++++++------ wrapper/src/wrapper.cpp | 39 ++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/compiler/parse_global.c b/src/compiler/parse_global.c index cc0157175..c905e1368 100644 --- a/src/compiler/parse_global.c +++ b/src/compiler/parse_global.c @@ -941,7 +941,14 @@ bool parse_attributes(ParseContext *context, Attr ***attributes_ref) attr->name = context->tok.id; attr->path = path; - TRY_CONSUME_OR(TOKEN_IDENT, "Expected an attribute", false); + if (tok_is(context, TOKEN_IDENT) || tok_is(context, TOKEN_TYPE_IDENT)) + { + advance(context); + } + else + { + TRY_CONSUME_OR(TOKEN_IDENT, "Expected an attribute", false); + } if (TOKEN_IS(TOKEN_LPAREN)) { @@ -1668,7 +1675,7 @@ static inline Decl *parse_define_ident(ParseContext *context, Visibility visibi } /** - * define_attribute ::= 'define' '@' IDENT '(' parameter_list ')' ('=' (void | attribute_list))? + * define_attribute ::= 'define' '@' IDENT '(' parameter_list ')' ('=' attribute_list)? */ static inline Decl *parse_define_attribute(ParseContext *context, Visibility visibility) { @@ -1702,10 +1709,7 @@ static inline Decl *parse_define_attribute(ParseContext *context, Visibility vi Attr **attributes = NULL; if (try_consume(context, TOKEN_EQ)) { - if (try_consume(context, TOKEN_VOID)) - { - if (!parse_attributes(context, &attributes)) return false; - } + if (!parse_attributes(context, &attributes)) return false; } decl->define_decl.define_kind = DEFINE_ATTRIBUTE; @@ -1714,6 +1718,7 @@ static inline Decl *parse_define_attribute(ParseContext *context, Visibility vi // 3. Set up the define. decl->span.loc = start; RANGE_EXTEND_PREV(decl); + TRY_CONSUME_EOS_OR(poisoned_decl); return decl; } diff --git a/wrapper/src/wrapper.cpp b/wrapper/src/wrapper.cpp index 26bf57471..50fa24bd8 100644 --- a/wrapper/src/wrapper.cpp +++ b/wrapper/src/wrapper.cpp @@ -2,30 +2,37 @@ // For hacking the C API #include "llvm/IR/IRBuilder.h" +#if LLVM_VERSION_MAJOR > 13 +#define LINK_SIG \ +bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, \ + llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); +#define CALL_ARGS arg_vector, false, output, output_err, false +#else +#define LINK_SIG \ +bool link(llvm::ArrayRef args, bool canExitEarly, \ +llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); +#define CALL_ARGS arg_vector, false, output, output_err +#endif + namespace lld { namespace coff { - bool link(llvm::ArrayRef args, bool canExitEarly, - llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); + LINK_SIG } namespace mingw { - bool link(llvm::ArrayRef args, bool canExitEarly, - llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); + LINK_SIG } namespace elf { - bool link(llvm::ArrayRef args, bool canExitEarly, - llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); + LINK_SIG } namespace mach_o { - bool link(llvm::ArrayRef args, bool canExitEarly, - llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); + LINK_SIG } namespace macho { - bool link(llvm::ArrayRef args, bool canExitEarly, - llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); + LINK_SIG } namespace wasm { @@ -54,23 +61,23 @@ static bool llvm_link(ObjFormat format, const char **args, int arg_count, const switch (format) { case ELF: - if (lld::elf::link(arg_vector, false, output, output_err)) return true; + if (lld::elf::link(CALL_ARGS)) return true; break; case MACHO: #if LLVM_VERSION_MAJOR > 13 - if (lld::macho::link(arg_vector, false, output, output_err)) return true; + if (lld::macho::link(CALL_ARGS)) return true; #else - if (lld::mach_o::link(arg_vector, false, output, output_err)) return true; + if (lld::mach_o::link(CALL_ARGS)) return true; #endif break; case WASM: - if (lld::wasm::link(arg_vector, false, output, output_err)) return true; + if (lld::wasm::link(CALL_ARGS)) return true; break; case COFF: - if (lld::coff::link(arg_vector, false, output, output_err)) return true; + if (lld::coff::link(CALL_ARGS)) return true; break; case MINGW: - if (lld::mingw::link(arg_vector, false, output, output_err)) return true; + if (lld::mingw::link(CALL_ARGS)) return true; break; default: exit(-1);