head 1.4; access; symbols pkgsrc-2024Q1:1.3.0.2 pkgsrc-2024Q1-base:1.3 pkgsrc-2023Q1:1.1.0.4 pkgsrc-2023Q1-base:1.1 pkgsrc-2022Q4:1.1.0.2 pkgsrc-2022Q4-base:1.1; locks; strict; comment @// @; 1.4 date 2024.06.05.17.17.33; author ryoon; state dead; branches; next 1.3; commitid xlwNDOCcaoC3LOcF; 1.3 date 2024.01.02.00.42.03; author ryoon; state Exp; branches; next 1.2; commitid PS69UyOAmkWqeOSE; 1.2 date 2023.06.11.03.40.24; author mef; state dead; branches; next 1.1; commitid NbhXMXW9xqJcOtsE; 1.1 date 2022.12.22.16.23.28; author wiz; state Exp; branches; next ; commitid 77Kob9rNWybIwz6E; desc @@ 1.4 log @cad/ghdl: Update to 4.1.0 Changelog: [2024-04-14] 4.1 The mcode backend is now fully supported on Windows x64 Coverage output has been improved for being supported by vunit. [2024-03-06] 4.0 For the mcode backend, elaboration of the designs is now performed before code generation. This allows some optimizations and the support of external names. There is a new signal dumper (using FST format) for the mcode backend. The GCC backend will be deprecated and the LLVM backend will be used like the mcode backend (code generation in memory). As a consequence, no backend will generate object files anymore. @ text @$NetBSD: patch-src_ortho_llvm6_llvm-cbindings.cpp,v 1.3 2024/01/02 00:42:03 ryoon Exp $ * Support LLVM 16 https://github.com/ghdl/ghdl/commit/776731910064cb6df03be19d788f7f13b2f7d2f1 * Support LLVM 17 https://github.com/ghdl/ghdl/commit/36a2e24f85aa3174d37b3a121632ac0b28bf990a --- src/ortho/llvm6/llvm-cbindings.cpp.orig 2023-03-08 06:40:01.000000000 +0000 +++ src/ortho/llvm6/llvm-cbindings.cpp @@@@ -31,10 +31,18 @@@@ #include "llvm-c/BitWriter.h" #include "llvm-c/Analysis.h" -#include "llvm-c/Transforms/Scalar.h" -#if LLVM_VERSION_MAJOR >= 7 + +#if LLVM_VERSION_MAJOR < 17 +# include "llvm-c/Transforms/Scalar.h" +# if LLVM_VERSION_MAJOR >= 7 // Not present in llvm-6, present in llvm-7 -#include "llvm-c/Transforms/Utils.h" +# include "llvm-c/Transforms/Utils.h" +# endif +#else +# include "llvm/Passes/OptimizationLevel.h" +# include "llvm/Analysis/LoopAnalysisManager.h" +# include "llvm/Analysis/CGSCCPassManager.h" +# include "llvm/Passes/PassBuilder.h" #endif #if LLVM_VERSION_MAJOR >= 6 @@@@ -77,7 +85,11 @@@@ static LLVMTargetRef TheTarget; static LLVMTargetMachineRef TheTargetMachine; static LLVMTargetDataRef TheTargetData; static LLVMRelocMode TheReloc = LLVMRelocDefault; -static LLVMCodeGenOptLevel Optimization = LLVMCodeGenLevelDefault; +static LLVMCodeGenOptLevel OptimizationCGLev = LLVMCodeGenLevelDefault; + +#if LLVM_VERSION_MAJOR >= 17 +static OptimizationLevel OptimizationLev = OptimizationLevel::O0; +#endif static LLVMBuilderRef Builder; static LLVMBuilderRef DeclBuilder; @@@@ -118,16 +130,28 @@@@ set_optimization_level (unsigned level) { switch(level) { case 0: - Optimization = LLVMCodeGenLevelNone; + OptimizationCGLev = LLVMCodeGenLevelNone; +#if LLVM_VERSION_MAJOR >= 17 + OptimizationLev = OptimizationLevel::O0; +#endif break; case 1: - Optimization = LLVMCodeGenLevelLess; + OptimizationCGLev = LLVMCodeGenLevelLess; +#if LLVM_VERSION_MAJOR >= 17 + OptimizationLev = OptimizationLevel::O1; +#endif break; case 2: - Optimization = LLVMCodeGenLevelDefault; + OptimizationCGLev = LLVMCodeGenLevelDefault; +#if LLVM_VERSION_MAJOR >= 17 + OptimizationLev = OptimizationLevel::O2; +#endif break; default: - Optimization = LLVMCodeGenLevelAggressive; + OptimizationCGLev = LLVMCodeGenLevelAggressive; +#if LLVM_VERSION_MAJOR >= 17 + OptimizationLev = OptimizationLevel::O3; +#endif break; } } @@@@ -201,7 +225,34 @@@@ generateCommon() } } - if (Optimization > LLVMCodeGenLevelNone) { +#if LLVM_VERSION_MAJOR >= 17 + // Create the analysis managers. + LoopAnalysisManager LAM; + FunctionAnalysisManager FAM; + CGSCCAnalysisManager CGAM; + ModuleAnalysisManager MAM; + + // Create the new pass manager builder. + // Take a look at the PassBuilder constructor parameters for more + // customization, e.g. specifying a TargetMachine or various debugging + // options. + PassBuilder PB; + + // Register all the basic analyses with the managers. + PB.registerModuleAnalyses(MAM); + PB.registerCGSCCAnalyses(CGAM); + PB.registerFunctionAnalyses(FAM); + PB.registerLoopAnalyses(LAM); + PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); + + // Create the pass manager. + // This one corresponds to a typical -O2 optimization pipeline. + ModulePassManager MPM = PB.buildPerModuleDefaultPipeline(OptimizationLev); + + // Optimize the IR! + MPM.run(*unwrap(TheModule), MAM); +#else + if (OptimizationCGLev > LLVMCodeGenLevelNone) { LLVMPassManagerRef PassManager; PassManager = LLVMCreateFunctionPassManagerForModule (TheModule); @@@@ -214,7 +265,9 @@@@ generateCommon() LLVMRunFunctionPassManager (PassManager, Func); } } +#endif } + extern "C" void generate_object(char *Filename) { @@@@ -292,7 +345,7 @@@@ ortho_llvm_init(const char *Filename, un // Create a target machine TheTargetMachine = LLVMCreateTargetMachine - (TheTarget, Triple, "", "", Optimization, TheReloc, + (TheTarget, Triple, "", "", OptimizationCGLev, TheReloc, LLVMCodeModelDefault); #if LLVM_VERSION_MAJOR < 4 @@@@ -353,7 +406,7 @@@@ ortho_llvm_init(const char *Filename, un StringRef(*DebugCurrentDirectory)); DebugCurrentCU = DBuilder->createCompileUnit (llvm::dwarf::DW_LANG_C, DebugCurrentFile, StringRef("ortho-llvm"), - Optimization > LLVMCodeGenLevelNone, StringRef(), 0); + OptimizationCGLev > LLVMCodeGenLevelNone, StringRef(), 0); DebugCurrentScope = DebugCurrentCU; } @@@@ -1040,8 +1093,13 @@@@ new_type_decl(OIdent Ident, OTnode Atype OTnode Ptr = static_cast(Atype)->Acc; // Possibly still incomplete Atype->Dbg = DBuilder->createPointerType - (Ptr ? Ptr->Dbg : nullptr, - Atype->getBitSize(), 0, None, StringRef(Ident.cstr)); + (Ptr ? Ptr->Dbg : nullptr, Atype->getBitSize(), 0, +#if LLVM_VERSION_MAJOR >= 16 + std::nullopt, +#else + None, +#endif + StringRef(Ident.cstr)); break; } @ 1.3 log @ghdl: Fix build with LLVM 16 @ text @d1 1 a1 1 $NetBSD$ @ 1.2 log @(cad/ghdl) remove patches/patch-src_ortho_llvm6_llvm-cbindings.cpp @ text @d1 1 a1 1 $NetBSD: patch-src_ortho_llvm6_llvm-cbindings.cpp,v 1.1 2022/12/22 16:23:28 wiz Exp $ d3 4 a6 2 llvm 15 support https://github.com/ghdl/ghdl/commit/bc95c0710baaf539085879e5008361e3ecb04600 d8 1 a8 1 --- src/ortho/llvm6/llvm-cbindings.cpp.orig 2022-02-28 18:46:53.000000000 +0000 d10 2 a11 3 @@@@ -41,6 +41,15 @@@@ #define USE_DEBUG #endif d13 11 a23 2 +#if LLVM_VERSION_MAJOR >= 15 +#define USE_OPAQUE_POINTERS d25 4 a28 35 +#define LLVMBuildGEP2(B,T,P,I,Nu,Na) LLVMBuildGEP(B,P,I,Nu,Na) +#define LLVMBuildLoad2(B,T,P,N) LLVMBuildLoad(B,P,N) +#define LLVMBuildCall2(B,T,F,A,Nu,Na) LLVMBuildCall(B,F,A,Nu,Na) +#define LLVMConstGEP2(T,V,I,N) LLVMConstGEP(V,I,N) +#endif + #ifdef USE_DEBUG #include "llvm/IR/IRBuilder.h" #include "llvm/IR/DIBuilder.h" @@@@ -77,6 +86,7 @@@@ static LLVMBuilderRef ExtraBuilder; static LLVMValueRef StackSaveFun; static LLVMValueRef StackRestoreFun; static LLVMValueRef CopySignFun; +static LLVMTypeRef CopySignFunType; static LLVMValueRef Fp0_5; @@@@ -311,9 +321,9 @@@@ ortho_llvm_init(const char *Filename, un ParamTypes[0] = LLVMDoubleType(); ParamTypes[1] = LLVMDoubleType(); + CopySignFunType = LLVMFunctionType(LLVMDoubleType(), ParamTypes, 2, false); CopySignFun = LLVMAddFunction - (TheModule, "llvm.copysign.f64", - LLVMFunctionType(LLVMDoubleType(), ParamTypes, 2, false)); + (TheModule, "llvm.copysign.f64", CopySignFunType); Fp0_5 = LLVMConstReal(LLVMDoubleType(), 0.5); @@@@ -326,7 +336,7 @@@@ ortho_llvm_init(const char *Filename, un AttrId = LLVMGetEnumAttributeKindForName("uwtable", 7); assert (AttrId != 0); - UwtableAttr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), AttrId, 0); + UwtableAttr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), AttrId, 1); d31 7 a37 6 #ifdef USE_DEBUG @@@@ -602,11 +612,19 @@@@ struct OTnodeIncompleteAcc : OTnodeAccBa extern "C" OTnode new_access_type(OTnode DType) { + LLVMTypeRef Ptr; d39 2 a40 10 +#ifdef USE_OPAQUE_POINTERS + Ptr = LLVMPointerTypeInContext(LLVMGetGlobalContext(), 0); +#else if (DType == nullptr) { return new OTnodeIncompleteAcc(); - } else { - return new OTnodeAcc(LLVMPointerType(DType->Ref, 0), DType); } + + Ptr = LLVMPointerType(DType->Ref, 0); a41 3 + + return new OTnodeAcc(Ptr, DType); } d43 31 a73 8 extern "C" void @@@@ -615,8 +633,11 @@@@ finish_access_type(OTnodeAcc *AccType, O // Must be incomplete. assert (AccType->Acc == nullptr); +#ifndef USE_OPAQUE_POINTERS LLVMTypeRef Types[1] = { DType->Ref }; LLVMStructSetBody(LLVMGetElementType(AccType->Ref), Types, 1, 0); d75 2 a76 64 + AccType->Acc = DType; #ifdef USE_DEBUG if (FlagDebug) { @@@@ -740,7 +761,7 @@@@ finish_record_type(OElementList *Els, OT LLVMTypeRef *Types = new LLVMTypeRef[Els->BndCount]; // Create types array for elements. - int i = 0; + unsigned i = 0; bool Bounded = true; for (OFnodeBase *Field : *Els->Els) { if (Field->FType->Bounded) @@@@ -1014,18 +1035,15 @@@@ new_type_decl(OIdent Ident, OTnode Atype break; case OTKIncompleteAccess: - if (static_cast(Atype)->Acc == nullptr) { - // Still incomplete + case OTKAccess: + { + OTnode Ptr = static_cast(Atype)->Acc; + // Possibly still incomplete Atype->Dbg = DBuilder->createPointerType - (nullptr, Atype->getBitSize(), 0, None, StringRef(Ident.cstr)); + (Ptr ? Ptr->Dbg : nullptr, + Atype->getBitSize(), 0, None, StringRef(Ident.cstr)); break; } - // Fallthrough - case OTKAccess: - Atype->Dbg = DBuilder->createPointerType - (static_cast(Atype)->Acc->Dbg, - Atype->getBitSize(), 0, None, StringRef(Ident.cstr)); - break; case OTKArray: // The debug info has already been created for arrays, as they can be @@@@ -1432,13 +1450,14 @@@@ new_interface_decl(OInterList *Inters, struct ODnodeSubprg : ODnodeBase { // Interfaces std::vector Inters; + LLVMTypeRef Ftype; // Storage OStorage Storage; OIdent Ident; ODKind getKind() const override { return ODKSubprg; } - ODnodeSubprg(LLVMValueRef R, OTnode T, OStorage S, OIdent Id, + ODnodeSubprg(LLVMValueRef R, OTnode T, LLVMTypeRef Ft, OStorage S, OIdent Id, const std::vector &Inters) : - ODnodeBase(R, T), Inters(Inters), Storage(S), Ident(Id) {} + ODnodeBase(R, T), Inters(Inters), Ftype(Ft), Storage(S), Ident(Id) {} }; extern "C" void @@@@ -1488,8 +1507,8 @@@@ finish_subprogram_decl(OInterList *Inter // Create the result. ODnodeSubprg *R; - R = new ODnodeSubprg(Decl, Inters->Rtype, Inters->Storage, Inters->Ident, - std::move(*Inters->Inters)); + R = new ODnodeSubprg(Decl, Inters->Rtype, Ftype, Inters->Storage, + Inters->Ident, std::move(*Inters->Inters)); *Res = R; d78 3 d82 31 a112 1 @@@@ -1693,8 +1712,8 @@@@ finish_declare_stmt () d114 2 a115 6 if (CurrentDeclareBlock->StackValue != nullptr) { // Restore stack pointer - LLVMBuildCall(Builder, StackRestoreFun, - &CurrentDeclareBlock->StackValue, 1, ""); + LLVMBuildCall2(Builder, LLVMVoidType(), StackRestoreFun, + &CurrentDeclareBlock->StackValue, 1, ""); a116 12 // Execution will continue on the next statement LLVMBuildBr(Builder, Bb); @@@@ -2084,8 +2103,8 @@@@ new_function_call (OAssocList *Assocs) LLVMValueRef Res; if (!Unreach) { - Res = LLVMBuildCall(Builder, Assocs->Subprg->Ref, - Assocs->Vals, Assocs->Subprg->Inters.size(), ""); + Res = LLVMBuildCall2(Builder, Assocs->Subprg->Ftype, Assocs->Subprg->Ref, + Assocs->Vals, Assocs->Subprg->Inters.size(), ""); } else { Res = nullptr; d118 1 a118 10 @@@@ -2097,8 +2116,8 @@@@ extern "C" void new_procedure_call (OAssocList *Assocs) { if (!Unreach) { - LLVMBuildCall(Builder, Assocs->Subprg->Ref, - Assocs->Vals, Assocs->Subprg->Inters.size(), ""); + LLVMBuildCall2(Builder, Assocs->Subprg->Ftype, Assocs->Subprg->Ref, + Assocs->Vals, Assocs->Subprg->Inters.size(), ""); } delete Assocs->Vals; a119 16 @@@@ -2468,7 +2487,7 @@@@ new_convert (OEnode Val, OTnode Rtype) LLVMValueRef Args[2]; Args[0] = Fp0_5; Args[1] = Val.Ref; - V = LLVMBuildCall(Builder, CopySignFun, Args, 2, ""); + V = LLVMBuildCall2(Builder, CopySignFunType, CopySignFun, Args, 2, ""); V = LLVMBuildFAdd(Builder, V, Val.Ref, ""); Res = LLVMBuildFPToSI(Builder, V, Rtype->Ref, ""); } @@@@ -2528,8 +2547,12 @@@@ new_alloca (OTnode Rtype, OEnode Size) LLVMPositionBuilderBefore(ExtraBuilder, FirstInsn); Bld = ExtraBuilder; } +#ifdef USE_OPAQUE_POINTERS + LLVMTypeRef Ptr = LLVMPointerTypeInContext(LLVMGetGlobalContext(), 0); +#endif d121 2 a122 30 CurrentDeclareBlock->StackValue = - LLVMBuildCall(Bld, StackSaveFun, nullptr, 0, ""); + LLVMBuildCall2(Bld, Ptr, StackSaveFun, nullptr, 0, ""); } Res = LLVMBuildArrayAlloca(Builder, LLVMInt8Type(), Size.Ref, ""); // Convert @@@@ -2564,10 +2587,10 @@@@ new_global_selected_element (OGnode Rec, case OF_Record: { LLVMValueRef Idx[2]; + OFnodeRec *F = static_cast(El); Idx[0] = LLVMConstInt(LLVMInt32Type(), 0, 0); - Idx[1] = LLVMConstInt(LLVMInt32Type(), - static_cast(El)->Index, 0); - Res = LLVMConstGEP(Rec.Ref, Idx, 2); + Idx[1] = LLVMConstInt(LLVMInt32Type(), F->Index, 0); + Res = LLVMConstGEP2(Rec.Gtype->Ref, Rec.Ref, Idx, 2); } break; case OF_Union: @@@@ -2629,7 +2652,7 @@@@ new_value (OLnode *Lvalue) if (Lvalue->Direct) Res = Lvalue->Ref; else - Res = LLVMBuildLoad(Builder, Lvalue->Ref, ""); + Res = LLVMBuildLoad2(Builder, Lvalue->Ltype->Ref, Lvalue->Ref, ""); } return {Res, Lvalue->Ltype }; } @@@@ -2646,15 +2669,16 @@@@ new_indexed_element (OLnode *Arr, OEnode d124 1 a124 3 LLVMValueRef Idx[2]; LLVMValueRef Res; + OTnode ElType = static_cast(Arr->Ltype)->ElType; d126 30 a155 33 if (Unreach) Res = nullptr; else { Idx[0] = LLVMConstInt(LLVMInt32Type(), 0, 0); Idx[1] = Index.Ref; - Res = LLVMBuildGEP(Builder, Arr->Ref, Idx, 2, ""); + Res = LLVMBuildGEP2(Builder, Arr->Ltype->Ref, Arr->Ref, Idx, 2, ""); } - return { false, Res, static_cast(Arr->Ltype)->ElType }; + return { false, Res, ElType }; } extern "C" OLnode @@@@ -2668,7 +2692,7 @@@@ new_slice (OLnode *Arr, OTnode Rtype, OE else { Idx[0] = LLVMConstInt(LLVMInt32Type(), 0, 0); Idx[1] = Index.Ref; - Res = LLVMBuildGEP(Builder, Arr->Ref, Idx, 2, ""); + Res = LLVMBuildGEP2(Builder, Arr->Ltype->Ref, Arr->Ref, Idx, 2, ""); Res = LLVMBuildBitCast(Builder, Res, LLVMPointerType(Rtype->Ref, 0), ""); } return { false, Res, Rtype}; @@@@ -2686,10 +2710,10 @@@@ new_selected_element (OLnode *Rec, OFnod case OF_Record: { LLVMValueRef Idx[2]; + OFnodeRec *F = static_cast(El); Idx[0] = LLVMConstInt(LLVMInt32Type(), 0, 0); - Idx[1] = LLVMConstInt(LLVMInt32Type(), - static_cast(El)->Index, 0); - Res = LLVMBuildGEP(Builder, Rec->Ref, Idx, 2, ""); + Idx[1] = LLVMConstInt(LLVMInt32Type(), F->Index, 0); + Res = LLVMBuildGEP2(Builder, Rec->Ltype->Ref, Rec->Ref, Idx, 2, ""); a156 24 break; case OF_Union: @@@@ -2705,6 +2729,7 @@@@ extern "C" OLnode new_access_element (OEnode Acc) { LLVMValueRef Res; + OTnode Ptype = static_cast(Acc.Etype)->Acc; switch(Acc.Etype->Kind) { case OTKAccess: @@@@ -2717,13 +2742,13 @@@@ new_access_element (OEnode Acc) Idx[0] = LLVMConstInt(LLVMInt32Type(), 0, 0); Idx[1] = LLVMConstInt(LLVMInt32Type(), 0, 0); - Res = LLVMBuildGEP(Builder, Acc.Ref, Idx, 2, ""); + Res = LLVMBuildGEP2(Builder, Acc.Etype->Ref, Acc.Ref, Idx, 2, ""); } break; default: llvm_unreachable("bad new_access_element"); } - return {false, Res, static_cast(Acc.Etype)->Acc }; + return {false, Res, Ptype }; } a157 1 extern "C" OEnode @ 1.1 log @ghdl: add upstream patch to fix build with llvm 15 Bump PKGREVISION @ text @d1 1 a1 1 $NetBSD$ @