Files
MINGW-packages/mingw-w64-python-llvmlite/llvm-14.patch
Markus Mützel d39bc3f6b1 python-llvmlite: update to 0.38.1
Use (modified) upstream patch to fix compilation with LLVM 14.
2022-06-12 20:44:15 +02:00

2140 lines
88 KiB
Diff

From 978e8f929115fb3057410ab162dbb1c29a3fe68d Mon Sep 17 00:00:00 2001
From: Andre Masella <andre@masella.name>
Date: Tue, 15 Mar 2022 15:12:26 -0400
Subject: [PATCH 1/6] Add more LLVM pass bindings
---
.clang-format | 2 +
ffi/passmanagers.cpp | 407 ++++++++++++++++++++++++-------
llvmlite/binding/passmanagers.py | 272 ++++++++++++++++++++-
llvmlite/tests/test_binding.py | 38 +++
4 files changed, 631 insertions(+), 88 deletions(-)
create mode 100644 .clang-format
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 000000000..a74fda4b6
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,2 @@
+BasedOnStyle: LLVM
+AlwaysBreakTemplateDeclarations: Yes
diff --git a/ffi/passmanagers.cpp b/ffi/passmanagers.cpp
index 0206d1759..a1fb0b880 100644
--- a/ffi/passmanagers.cpp
+++ b/ffi/passmanagers.cpp
@@ -2,19 +2,36 @@
#include "core.h"
-#include "llvm/IR/Module.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/DiagnosticPrinter.h"
+#include "llvm/IR/Module.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm-c/Transforms/Scalar.h"
#include "llvm-c/Transforms/IPO.h"
+#include "llvm-c/Transforms/Scalar.h"
#include "llvm/IR/LegacyPassManager.h"
-#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/IPO.h"
+#include "llvm/Transforms/Scalar.h"
#include <llvm/IR/PassTimingInfo.h>
+#include <llvm/Analysis/AliasAnalysisEvaluator.h>
+#include <llvm/Analysis/BasicAliasAnalysis.h>
+#include <llvm/Analysis/CFGPrinter.h>
+#include <llvm/Analysis/CallPrinter.h>
+#include <llvm/Analysis/DependenceAnalysis.h>
+#include <llvm/Analysis/DomPrinter.h>
+#include <llvm/Analysis/GlobalsModRef.h>
+#include <llvm/Analysis/IVUsers.h>
+#include <llvm/Analysis/Lint.h>
+#include <llvm/Analysis/Passes.h>
+#include <llvm/Analysis/ScalarEvolutionAliasAnalysis.h>
+#include <llvm/CodeGen/Passes.h>
+#include <llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h>
+#include <llvm/Transforms/IPO.h>
+#include <llvm/Transforms/IPO/AlwaysInliner.h>
+#include <llvm/Transforms/Utils.h>
+#include <llvm/Transforms/Utils/UnifyFunctionExitNodes.h>
using namespace llvm;
/*
@@ -24,164 +41,380 @@ using namespace llvm;
extern "C" {
API_EXPORT(void)
-LLVMPY_SetTimePasses(bool enable){
- TimePassesIsEnabled = enable;
-}
+LLVMPY_SetTimePasses(bool enable) { TimePassesIsEnabled = enable; }
API_EXPORT(void)
LLVMPY_ReportAndResetTimings(const char **outmsg) {
- std::string osbuf;
- raw_string_ostream os(osbuf);
- reportAndResetTimings(&os);
- os.flush();
- *outmsg = LLVMPY_CreateString(os.str().c_str());
+ std::string osbuf;
+ raw_string_ostream os(osbuf);
+ reportAndResetTimings(&os);
+ os.flush();
+ *outmsg = LLVMPY_CreateString(os.str().c_str());
}
-
API_EXPORT(LLVMPassManagerRef)
-LLVMPY_CreatePassManager()
-{
- return LLVMCreatePassManager();
-}
+LLVMPY_CreatePassManager() { return LLVMCreatePassManager(); }
API_EXPORT(void)
-LLVMPY_DisposePassManager(LLVMPassManagerRef PM)
-{
- return LLVMDisposePassManager(PM);
+LLVMPY_DisposePassManager(LLVMPassManagerRef PM) {
+ return LLVMDisposePassManager(PM);
}
API_EXPORT(LLVMPassManagerRef)
-LLVMPY_CreateFunctionPassManager(LLVMModuleRef M)
-{
- return LLVMCreateFunctionPassManagerForModule(M);
+LLVMPY_CreateFunctionPassManager(LLVMModuleRef M) {
+ return LLVMCreateFunctionPassManagerForModule(M);
}
API_EXPORT(int)
-LLVMPY_RunPassManager(LLVMPassManagerRef PM,
- LLVMModuleRef M)
-{
- return LLVMRunPassManager(PM, M);
+LLVMPY_RunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) {
+ return LLVMRunPassManager(PM, M);
}
API_EXPORT(int)
-LLVMPY_RunFunctionPassManager(LLVMPassManagerRef PM,
- LLVMValueRef F)
-{
- return LLVMRunFunctionPassManager(PM, F);
+LLVMPY_RunFunctionPassManager(LLVMPassManagerRef PM, LLVMValueRef F) {
+ return LLVMRunFunctionPassManager(PM, F);
}
API_EXPORT(int)
-LLVMPY_InitializeFunctionPassManager(LLVMPassManagerRef FPM)
-{
- return LLVMInitializeFunctionPassManager(FPM);
+LLVMPY_InitializeFunctionPassManager(LLVMPassManagerRef FPM) {
+ return LLVMInitializeFunctionPassManager(FPM);
}
API_EXPORT(int)
-LLVMPY_FinalizeFunctionPassManager(LLVMPassManagerRef FPM)
-{
- return LLVMFinalizeFunctionPassManager(FPM);
+LLVMPY_FinalizeFunctionPassManager(LLVMPassManagerRef FPM) {
+ return LLVMFinalizeFunctionPassManager(FPM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddAAEvalPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createAAEvalPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddBasicAAPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createBasicAAWrapperPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddDependenceAnalysisPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createDependenceAnalysisWrapperPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddCallGraphViewerPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createCallGraphViewerPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddDotCallGraphPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createCallGraphDOTPrinterPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddDotDomPrinterPass(LLVMPassManagerRef PM, bool showBody) {
+ unwrap(PM)->add(showBody ? llvm::createDomPrinterPass()
+ : llvm::createDomOnlyPrinterPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddGlobalsModRefAAPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createGlobalsAAWrapperPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddDotPostDomPrinterPass(LLVMPassManagerRef PM, bool showBody) {
+ unwrap(PM)->add(showBody ? llvm::createPostDomPrinterPass()
+ : llvm::createPostDomOnlyPrinterPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddCFGPrinterPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createCFGPrinterLegacyPassPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddConstantMergePass(LLVMPassManagerRef PM) {
+ LLVMAddConstantMergePass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddDeadInstructionEliminationPrinterPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createDeadInstEliminationPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddDeadStoreEliminationPrinterPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createDeadStoreEliminationPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddPostOrderFunctionAttrsPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createReversePostOrderFunctionAttrsPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddDeadArgEliminationPass(LLVMPassManagerRef PM) {
+ LLVMAddDeadArgEliminationPass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddInstructionCountPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createInstCountPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddIVUsersPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createIVUsersPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddLazyValueInfoPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createLazyValueInfoPass());
+}
+API_EXPORT(void)
+LLVMPY_AddLintPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createLintPass());
+}
+API_EXPORT(void)
+LLVMPY_AddModuleDebugInfoPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createModuleDebugInfoPrinterPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddRegionInfoPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createRegionInfoPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddScalarEvolutionAAPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createSCEVAAWrapperPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddAggressiveDCEPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createAggressiveDCEPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddAlwaysInlinePass(LLVMPassManagerRef PM, bool insertLifetime) {
+ unwrap(PM)->add(llvm::createAlwaysInlinerLegacyPass(insertLifetime));
+}
+
+API_EXPORT(void)
+LLVMPY_AddArgPromotionPass(LLVMPassManagerRef PM, unsigned int maxElements) {
+ unwrap(PM)->add(llvm::createArgumentPromotionPass(maxElements));
+}
+
+API_EXPORT(void)
+LLVMPY_AddBreakCritEdgesPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(llvm::createBreakCriticalEdgesPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddFunctionAttrsPass(LLVMPassManagerRef PM) {
+ LLVMAddFunctionAttrsPass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddFunctionInliningPass(LLVMPassManagerRef PM, int Threshold) {
+ unwrap(PM)->add(createFunctionInliningPass(Threshold));
+}
+
+API_EXPORT(void)
+LLVMPY_AddGlobalOptimizerPass(LLVMPassManagerRef PM) {
+ LLVMAddGlobalOptimizerPass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddGlobalDCEPass(LLVMPassManagerRef PM) { LLVMAddGlobalDCEPass(PM); }
+
+API_EXPORT(void)
+LLVMPY_AddIPSCCPPass(LLVMPassManagerRef PM) { LLVMAddIPSCCPPass(PM); }
+
+API_EXPORT(void)
+LLVMPY_AddDeadCodeEliminationPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createDeadCodeEliminationPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddAggressiveInstructionCombiningPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createAggressiveInstCombinerPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddInternalizePass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createInternalizePass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddJumpThreadingPass(LLVMPassManagerRef PM, int threshold) {
+ unwrap(PM)->add(createJumpThreadingPass(threshold));
+}
+
+API_EXPORT(void)
+LLVMPY_AddLCSSAPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLCSSAPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddLoopDeletionPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLoopDeletionPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddLoopExtractorPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLoopExtractorPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddSingleLoopExtractorPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createSingleLoopExtractorPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddLoopStrengthReducePass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLoopStrengthReducePass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddLoopSimplificationPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLoopSimplifyPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddLoopUnrollPass(LLVMPassManagerRef PM) { LLVMAddLoopUnrollPass(PM); }
+
+API_EXPORT(void)
+LLVMPY_AddLoopUnrollAndJamPass(LLVMPassManagerRef PM) {
+ LLVMAddLoopUnrollAndJamPass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddLoopUnswitchPass(LLVMPassManagerRef PM, bool optimizeForSize,
+ bool hasBranchDivergence) {
+ unwrap(PM)->add(createLoopUnswitchPass(optimizeForSize, hasBranchDivergence));
}
API_EXPORT(void)
-LLVMPY_AddConstantMergePass(LLVMPassManagerRef PM)
-{
- LLVMAddConstantMergePass(PM);
+LLVMPY_AddLowerAtomicPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLowerAtomicPass());
}
API_EXPORT(void)
-LLVMPY_AddDeadArgEliminationPass(LLVMPassManagerRef PM)
-{
- LLVMAddDeadArgEliminationPass(PM);
+LLVMPY_AddLowerInvokePass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLowerInvokePass());
}
API_EXPORT(void)
-LLVMPY_AddFunctionAttrsPass(LLVMPassManagerRef PM)
-{
- LLVMAddFunctionAttrsPass(PM);
+LLVMPY_AddLowerSwitchPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createLowerSwitchPass());
}
API_EXPORT(void)
-LLVMPY_AddFunctionInliningPass(LLVMPassManagerRef PM, int Threshold)
-{
- unwrap(PM)->add(createFunctionInliningPass(Threshold));
+LLVMPY_AddMemCpyOptimizationPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createMemCpyOptPass());
}
API_EXPORT(void)
-LLVMPY_AddGlobalOptimizerPass(LLVMPassManagerRef PM)
-{
- LLVMAddGlobalOptimizerPass(PM);
+LLVMPY_AddMergeFunctionsPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createMergeFunctionsPass());
}
API_EXPORT(void)
-LLVMPY_AddGlobalDCEPass(LLVMPassManagerRef PM)
-{
- LLVMAddGlobalDCEPass(PM);
+LLVMPY_AddMergeReturnsPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createUnifyFunctionExitNodesPass());
}
API_EXPORT(void)
-LLVMPY_AddIPSCCPPass(LLVMPassManagerRef PM)
-{
- LLVMAddIPSCCPPass(PM);
+LLVMPY_AddPartialInliningPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createPartialInliningPass());
}
API_EXPORT(void)
-LLVMPY_AddDeadCodeEliminationPass(LLVMPassManagerRef PM)
-{
- unwrap(PM)->add(createDeadCodeEliminationPass());
+LLVMPY_AddPruneExceptionHandlingPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createPruneEHPass());
}
API_EXPORT(void)
-LLVMPY_AddCFGSimplificationPass(LLVMPassManagerRef PM)
-{
- LLVMAddCFGSimplificationPass(PM);
+LLVMPY_AddReassociatePass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createReassociatePass());
}
API_EXPORT(void)
-LLVMPY_AddGVNPass(LLVMPassManagerRef PM)
-{
- LLVMAddGVNPass(PM);
+LLVMPY_AddDemoteRegisterToMemoryPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createDemoteRegisterToMemoryPass());
}
API_EXPORT(void)
-LLVMPY_AddInstructionCombiningPass(LLVMPassManagerRef PM)
-{
- LLVMAddInstructionCombiningPass(PM);
+LLVMPY_AddSinkPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createSinkingPass());
}
API_EXPORT(void)
-LLVMPY_AddLICMPass(LLVMPassManagerRef PM)
-{
- LLVMAddLICMPass(PM);
+LLVMPY_AddStripSymbolsPass(LLVMPassManagerRef PM, bool onlyDebugInfo) {
+ unwrap(PM)->add(createStripSymbolsPass(onlyDebugInfo));
}
API_EXPORT(void)
-LLVMPY_AddSCCPPass(LLVMPassManagerRef PM)
-{
- LLVMAddSCCPPass(PM);
+LLVMPY_AddStripDeadDebugInfoPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createStripDeadDebugInfoPass());
}
API_EXPORT(void)
-LLVMPY_AddSROAPass(LLVMPassManagerRef PM)
-{
- unwrap(PM)->add(createSROAPass());
+LLVMPY_AddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createStripDeadPrototypesPass());
}
API_EXPORT(void)
-LLVMPY_AddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM)
-{
- LLVMAddTypeBasedAliasAnalysisPass(PM);
+LLVMPY_AddStripDebugDeclarePrototypesPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createStripDebugDeclarePass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddStripNondebugSymbolsPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createStripNonDebugSymbolsPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddTailCallEliminationPass(LLVMPassManagerRef PM) {
+ unwrap(PM)->add(createTailCallEliminationPass());
+}
+
+API_EXPORT(void)
+LLVMPY_AddCFGSimplificationPass(LLVMPassManagerRef PM) {
+ LLVMAddCFGSimplificationPass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddGVNPass(LLVMPassManagerRef PM) { LLVMAddGVNPass(PM); }
+
+API_EXPORT(void)
+LLVMPY_AddInstructionCombiningPass(LLVMPassManagerRef PM) {
+ LLVMAddInstructionCombiningPass(PM);
+}
+
+API_EXPORT(void)
+LLVMPY_AddLICMPass(LLVMPassManagerRef PM) { LLVMAddLICMPass(PM); }
+
+API_EXPORT(void)
+LLVMPY_AddSCCPPass(LLVMPassManagerRef PM) { LLVMAddSCCPPass(PM); }
+
+API_EXPORT(void)
+LLVMPY_AddSROAPass(LLVMPassManagerRef PM) { unwrap(PM)->add(createSROAPass()); }
+
+API_EXPORT(void)
+LLVMPY_AddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM) {
+ LLVMAddTypeBasedAliasAnalysisPass(PM);
}
API_EXPORT(void)
-LLVMPY_AddBasicAliasAnalysisPass(LLVMPassManagerRef PM)
-{
- LLVMAddBasicAliasAnalysisPass(PM);
+LLVMPY_AddBasicAliasAnalysisPass(LLVMPassManagerRef PM) {
+ LLVMAddBasicAliasAnalysisPass(PM);
}
API_EXPORT(void)
-LLVMPY_LLVMAddLoopRotatePass(LLVMPassManagerRef PM)
-{
- LLVMAddLoopRotatePass(PM);
+LLVMPY_LLVMAddLoopRotatePass(LLVMPassManagerRef PM) {
+ LLVMAddLoopRotatePass(PM);
}
} // end extern "C"
diff --git a/llvmlite/binding/passmanagers.py b/llvmlite/binding/passmanagers.py
index 6f9b7aa31..3601f5f9f 100644
--- a/llvmlite/binding/passmanagers.py
+++ b/llvmlite/binding/passmanagers.py
@@ -1,4 +1,4 @@
-from ctypes import c_bool, c_int, c_size_t, Structure, byref
+from ctypes import c_bool, c_int, c_size_t, c_uint, Structure, byref
from collections import namedtuple
from enum import IntFlag
from llvmlite.binding import ffi
@@ -104,6 +104,14 @@ class PassManager(ffi.ObjectRef):
def _dispose(self):
self._capi.LLVMPY_DisposePassManager(self)
+ def add_aa_eval_pass(self):
+ """See https://llvm.org/docs/Passes.html#aa-eval-exhaustive-alias-analysis-precision-evaluator.""" # noqa E501
+ ffi.lib.LLVMPY_AddAAEvalPass(self)
+
+ def add_basic_aa_pass(self):
+ """See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl.""" # noqa E501
+ ffi.lib.LLVMPY_AddBasicAAPass(self)
+
def add_constant_merge_pass(self):
"""See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants.""" # noqa E501
ffi.lib.LLVMPY_AddConstantMergePass(self)
@@ -112,6 +120,86 @@ def add_dead_arg_elimination_pass(self):
"""See http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination.""" # noqa E501
ffi.lib.LLVMPY_AddDeadArgEliminationPass(self)
+ def add_dependence_analysis_pass(self):
+ """See https://llvm.org/docs/Passes.html#da-dependence-analysis""" # noqa E501
+ ffi.lib.LLVMPY_AddDependenceAnalysisPass(self)
+
+ def add_dot_call_graph_pass(self):
+ """See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file""" # noqa E501
+ ffi.lib.LLVMPY_AddDotCallGraphPass(self)
+
+ def add_dot_cfg_printer_pass(self):
+ """See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file""" # noqa E501
+ ffi.lib.LLVMPY_AddCallGraphViewerPass(self)
+
+ def add_dot_dom_printer_pass(self, show_body=False):
+ """See https://llvm.org/docs/Passes.html#dot-dom-print-dominance-tree-of-function-to-dot-file""" # noqa E501
+ ffi.lib.LLVMPY_AddDotDomPrinterPass(self, show_body)
+
+ def add_dot_postdom_printer_pass(self, show_body=False):
+ """See https://llvm.org/docs/Passes.html#dot-postdom-print-postdominance-tree-of-function-to-dot-file""" # noqa E501
+ ffi.lib.LLVMPY_AddDotPostDomPrinterPass(self, show_body)
+
+ def add_globals_mod_ref_aa_pass(self):
+ """See https://llvm.org/docs/Passes.html#globalsmodref-aa-simple-mod-ref-analysis-for-globals""" # noqa E501
+ ffi.lib.LLVMPY_AddGlobalsModRefAAPass(self)
+
+ def add_iv_users_pass(self):
+ """See https://llvm.org/docs/Passes.html#iv-users-induction-variable-users""" # noqa E501
+ ffi.lib.LLVMPY_AddIVUsersPass(self)
+
+ def add_lint_pass(self):
+ """See https://llvm.org/docs/Passes.html#libcall-aa-libcall-alias-analysis""" # noqa E501
+ ffi.lib.LLVMPY_AddLintPass(self)
+
+ def add_lazy_value_info_pass(self):
+ """See https://llvm.org/docs/Passes.html#lazy-value-info-lazy-value-information-analysis""" # noqa E501
+ ffi.lib.LLVMPY_AddLazyValueInfoPass(self)
+
+ def add_intervals_pass(self):
+ """See https://llvm.org/docs/Passes.html#intervals-interval-partition-construction""" # noqa E501
+ ffi.lib.LLVMPY_AddIntervalsPass(self)
+
+ def add_module_debug_info_pass(self):
+ """See https://llvm.org/docs/Passes.html#intervals-interval-partition-construction""" # noqa E501
+ ffi.lib.LLVMPY_AddModuleDebugInfoPass(self)
+
+ def add_region_info_pass(self):
+ """See https://llvm.org/docs/Passes.html#regions-detect-single-entry-single-exit-regions""" # noqa E501
+ ffi.lib.LLVMPY_AddRegionInfoPass(self)
+
+ def add_scalar_evolution_aa_pass(self):
+ """See https://llvm.org/docs/Passes.html#scev-aa-scalarevolution-based-alias-analysis""" # noqa E501
+ ffi.lib.LLVMPY_AddScalarEvolutionAAPass(self)
+
+ def add_aggressive_dead_code_elimination_pass(self):
+ """See https://llvm.org/docs/Passes.html#adce-aggressive-dead-code-elimination""" # noqa E501
+ ffi.lib.LLVMPY_AddAggressiveDCEPass(self)
+
+ def add_always_inline_pass(self, insert_lifetime=True):
+ """See https://llvm.org/docs/Passes.html#always-inline-inliner-for-always-inline-functions""" # noqa E501
+ ffi.lib.LLVMPY_AddAlwaysInlinePass(self, insert_lifetime)
+
+ def add_arg_promotion_pass(self, max_elements):
+ """See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars""" # noqa E501
+ ffi.lib.LLVMPY_AddArgPromotionPass(self, max_elements)
+
+ def add_break_critical_edges_pass(self):
+ """See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg""" # noqa E501
+ ffi.lib.LLVMPY_AddBreakCritEdgesPass(self)
+
+ def add_dead_instruction_elimination_pass(self):
+ """See https://llvm.org/docs/Passes.html#die-dead-instruction-elimination""" # noqa E501
+ ffi.lib.LLVMPY_AddDeadInstructionEliminationPrinterPass(self)
+
+ def add_dead_store_elimination_pass(self):
+ """See https://llvm.org/docs/Passes.html#dse-dead-store-elimination""" # noqa E501
+ ffi.lib.LLVMPY_AddDeadStoreEliminationPrinterPass(self)
+
+ def add_post_order_function_attrs_pass(self):
+ """See https://llvm.org/docs/Passes.html#function-attrs-deduce-function-attributes""" # noqa E501
+ ffi.lib.LLVMPY_AddPostOrderFunctionAttrsPass(self)
+
def add_function_attrs_pass(self):
"""See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes.""" # noqa E501
ffi.lib.LLVMPY_AddFunctionAttrsPass(self)
@@ -136,10 +224,26 @@ def add_dead_code_elimination_pass(self):
"""See http://llvm.org/docs/Passes.html#dce-dead-code-elimination."""
ffi.lib.LLVMPY_AddDeadCodeEliminationPass(self)
+ def add_aggressive_instruction_combining_pass(self):
+ """See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns""" # noqa E501
+ ffi.lib.LLVMPY_AddAggressiveInstructionCombiningPass(self)
+
+ def add_internalize_pass(self):
+ """See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols""" # noqa E501
+ ffi.lib.LLVMPY_AddInternalizePass(self)
+
def add_cfg_simplification_pass(self):
"""See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg."""
ffi.lib.LLVMPY_AddCFGSimplificationPass(self)
+ def add_jump_threading_pass(self, threshold):
+ """See https://llvm.org/docs/Passes.html#jump-threading-jump-threading""" # noqa E501
+ ffi.lib.LLVMPY_AddJumpThreadingPass(self, threshold)
+
+ def add_lcssa_pass(self):
+ """See https://llvm.org/docs/Passes.html#lcssa-loop-closed-ssa-form-pass""" # noqa E501
+ ffi.lib.LLVMPY_AddLCSSAPass(self)
+
def add_gvn_pass(self):
"""See http://llvm.org/docs/Passes.html#gvn-global-value-numbering."""
ffi.lib.LLVMPY_AddGVNPass(self)
@@ -152,16 +256,120 @@ def add_licm_pass(self):
"""See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion.""" # noqa E501
ffi.lib.LLVMPY_AddLICMPass(self)
+ def add_loop_deletion_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-deletion-delete-dead-loops""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopDeletionPass(self)
+
+ def add_loop_extractor_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-extract-extract-loops-into-new-functions""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopExtractorPass(self)
+
+ def add_single_loop_extractor_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-extract-single-extract-at-most-one-loop-into-a-new-function""" # noqa E501
+ ffi.lib.LLVMPY_AddSingleLoopExtractorPass(self)
+
def add_sccp_pass(self):
"""See http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation.""" # noqa E501
ffi.lib.LLVMPY_AddSCCPPass(self)
+ def add_loop_strength_reduce_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-reduce-loop-strength-reduction""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopStrengthReducePass(self)
+
+ def add_loop_simplification_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-simplify-canonicalize-natural-loops""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopSimplificationPass(self)
+
+ def add_loop_unroll_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopUnrollPass(self)
+
+ def add_loop_unroll_and_jam_pass(self):
+ """See https://llvm.org/docs/Passes.html#loop-unroll-and-jam-unroll-and-jam-loops""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopUnrollAndJamPass(self)
+
+ def add_loop_unswitch_pass(self,
+ optimize_for_size=False,
+ has_branch_divergence=False):
+ """See https://llvm.org/docs/Passes.html#loop-unswitch-unswitch-loops""" # noqa E501
+ ffi.lib.LLVMPY_AddLoopUnswitchPass(self,
+ optimize_for_size,
+ has_branch_divergence)
+
+ def add_lower_atomic_pass(self):
+ """See https://llvm.org/docs/Passes.html#loweratomic-lower-atomic-intrinsics-to-non-atomic-form""" # noqa E501
+ ffi.lib.LLVMPY_AddLowerAtomicPass(self)
+
+ def add_lower_invoke_pass(self):
+ """See https://llvm.org/docs/Passes.html#lowerinvoke-lower-invokes-to-calls-for-unwindless-code-generators""" # noqa E501
+ ffi.lib.LLVMPY_AddLowerInvokePass(self)
+
+ def add_lower_switch_pass(self):
+ """See https://llvm.org/docs/Passes.html#lowerswitch-lower-switchinsts-to-branches""" # noqa E501
+ ffi.lib.LLVMPY_AddLowerSwitchPass(self)
+
+ def add_memcpy_optimization_pass(self):
+ """See https://llvm.org/docs/Passes.html#memcpyopt-memcpy-optimization""" # noqa E501
+ ffi.lib.LLVMPY_AddMemCpyOptimizationPass(self)
+
+ def add_merge_functions_pass(self):
+ """See https://llvm.org/docs/Passes.html#mergefunc-merge-functions""" # noqa E501
+ ffi.lib.LLVMPY_AddMergeFunctionsPass(self)
+
+ def add_merge_returns_pass(self):
+ """See https://llvm.org/docs/Passes.html#mergereturn-unify-function-exit-nodes""" # noqa E501
+ ffi.lib.LLVMPY_AddMergeReturnsPass(self)
+
+ def add_partial_inlining_pass(self):
+ """See https://llvm.org/docs/Passes.html#partial-inliner-partial-inliner""" # noqa E501
+ ffi.lib.LLVMPY_AddPartialInliningPass(self)
+
+ def add_prune_exception_handling_pass(self):
+ """See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info""" # noqa E501
+ ffi.lib.LLVMPY_AddPruneExceptionHandlingPass(self)
+
+ def add_reassociate_pass(self):
+ """See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions""" # noqa E501
+ ffi.lib.LLVMPY_AddReassociatePass(self)
+
+ def add_demote_register_to_memory_pass(self):
+ """See https://llvm.org/docs/Passes.html#rel-lookup-table-converter-relative-lookup-table-converter""" # noqa E501
+ ffi.lib.LLVMPY_AddDemoteRegisterToMemoryPass(self)
+
def add_sroa_pass(self):
"""See http://llvm.org/docs/Passes.html#scalarrepl-scalar-replacement-of-aggregates-dt.
Note that this pass corresponds to the ``opt -sroa`` command-line option,
despite the link above.""" # noqa E501
ffi.lib.LLVMPY_AddSROAPass(self)
+ def add_sink_pass(self):
+ """See https://llvm.org/docs/Passes.html#sink-code-sinking""" # noqa E501
+ ffi.lib.LLVMPY_AddSinkPass(self)
+
+ def add_strip_symbols_pass(self, only_debug=False):
+ """See https://llvm.org/docs/Passes.html#strip-strip-all-symbols-from-a-module""" # noqa E501
+ ffi.lib.LLVMPY_AddStripSymbolsPass(self, only_debug)
+
+ def add_strip_dead_debug_info_pass(self):
+ """See https://llvm.org/docs/Passes.html#strip-dead-debug-info-strip-debug-info-for-unused-symbols""" # noqa E501
+ ffi.lib.LLVMPY_AddStripDeadDebugInfoPass(self)
+
+ def add_strip_dead_prototypes_pass(self):
+ """See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes""" # noqa E501
+ ffi.lib.LLVMPY_AddStripDeadPrototypesPass(self)
+
+ def add_strip_debug_declare_pass(self):
+ """See https://llvm.org/docs/Passes.html#strip-debug-declare-strip-all-llvm-dbg-declare-intrinsics""" # noqa E501
+ ffi.lib.LLVMPY_AddStripDebugDeclarePrototypesPass(self)
+
+ def add_strip_nondebug_symbols_pass(self):
+ """See https://llvm.org/docs/Passes.html#strip-nondebug-strip-all-symbols-except-dbg-symbols-from-a-module""" # noqa E501
+ ffi.lib.LLVMPY_AddStripNondebugSymbolsPass(self)
+
+ def add_tail_call_elimination_pass(self):
+ """See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination""" # noqa E501
+ ffi.lib.LLVMPY_AddTailCallEliminationPass(self)
+
def add_type_based_alias_analysis_pass(self):
ffi.lib.LLVMPY_AddTypeBasedAliasAnalysisPass(self)
@@ -260,8 +468,70 @@ def run(self, function):
ffi.LLVMValueRef]
ffi.lib.LLVMPY_RunFunctionPassManager.restype = c_bool
+ffi.lib.LLVMPY_AddAAEvalPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddBasicAAPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddConstantMergePass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddDeadArgEliminationPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDependenceAnalysisPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDotCallGraphPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddCallGraphViewerPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDotDomPrinterPass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
+ffi.lib.LLVMPY_AddDotPostDomPrinterPass.argtypes = [
+ ffi.LLVMPassManagerRef,
+ c_bool]
+ffi.lib.LLVMPY_AddGlobalsModRefAAPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddInstructionCountPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddIVUsersPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLazyValueInfoPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLintPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddModuleDebugInfoPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddRegionInfoPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddScalarEvolutionAAPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddAggressiveDCEPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddAlwaysInlinePass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
+ffi.lib.LLVMPY_AddArgPromotionPass.argtypes = [ffi.LLVMPassManagerRef, c_uint]
+ffi.lib.LLVMPY_AddBreakCritEdgesPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDeadInstructionEliminationPrinterPass.argtypes = [
+ ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDeadStoreEliminationPrinterPass.argtypes = [
+ ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddPostOrderFunctionAttrsPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddAggressiveInstructionCombiningPass.argtypes = [
+ ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddInternalizePass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLCSSAPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopDeletionPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopExtractorPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddSingleLoopExtractorPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopStrengthReducePass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopStrengthReducePass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopSimplificationPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopUnrollPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopUnrollAndJamPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLoopUnswitchPass.argtypes = [
+ ffi.LLVMPassManagerRef,
+ c_bool,
+ c_bool]
+ffi.lib.LLVMPY_AddLoopUnrollPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLowerAtomicPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLowerInvokePass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddLowerSwitchPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddMemCpyOptimizationPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddMergeFunctionsPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddMergeReturnsPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddPartialInliningPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddPruneExceptionHandlingPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddReassociatePass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDemoteRegisterToMemoryPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddSinkPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddStripSymbolsPass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
+ffi.lib.LLVMPY_AddStripDeadDebugInfoPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddStripDeadPrototypesPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddStripDebugDeclarePrototypesPass.argtypes = [
+ ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddStripNondebugSymbolsPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddTailCallEliminationPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddJumpThreadingPass.argtypes = [ffi.LLVMPassManagerRef, c_int]
ffi.lib.LLVMPY_AddFunctionAttrsPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddFunctionInliningPass.argtypes = [
ffi.LLVMPassManagerRef, c_int]
diff --git a/llvmlite/tests/test_binding.py b/llvmlite/tests/test_binding.py
index 7c21f4267..035b720bc 100644
--- a/llvmlite/tests/test_binding.py
+++ b/llvmlite/tests/test_binding.py
@@ -1407,6 +1407,44 @@ def test_populate(self):
pm.add_type_based_alias_analysis_pass()
pm.add_basic_alias_analysis_pass()
pm.add_loop_rotate_pass()
+ pm.add_region_info_pass()
+ pm.add_scalar_evolution_aa_pass()
+ pm.add_aggressive_dead_code_elimination_pass()
+ pm.add_always_inline_pass()
+ pm.add_arg_promotion_pass(42)
+ pm.add_break_critical_edges_pass()
+ pm.add_dead_instruction_elimination_pass()
+ pm.add_dead_store_elimination_pass()
+ pm.add_post_order_function_attrs_pass()
+ pm.add_aggressive_instruction_combining_pass()
+ pm.add_internalize_pass()
+ pm.add_jump_threading_pass(7)
+ pm.add_lcssa_pass()
+ pm.add_loop_deletion_pass()
+ pm.add_loop_extractor_pass()
+ pm.add_single_loop_extractor_pass()
+ pm.add_loop_strength_reduce_pass()
+ pm.add_loop_simplification_pass()
+ pm.add_loop_unroll_pass()
+ pm.add_loop_unroll_and_jam_pass()
+ pm.add_loop_unswitch_pass()
+ pm.add_lower_atomic_pass()
+ pm.add_lower_invoke_pass()
+ pm.add_lower_switch_pass()
+ pm.add_memcpy_optimization_pass()
+ pm.add_merge_functions_pass()
+ pm.add_merge_returns_pass()
+ pm.add_partial_inlining_pass()
+ pm.add_prune_exception_handling_pass()
+ pm.add_reassociate_pass()
+ pm.add_demote_register_to_memory_pass()
+ pm.add_sink_pass()
+ pm.add_strip_symbols_pass()
+ pm.add_strip_dead_debug_info_pass()
+ pm.add_strip_dead_prototypes_pass()
+ pm.add_strip_debug_declare_pass()
+ pm.add_strip_nondebug_symbols_pass()
+ pm.add_tail_call_elimination_pass()
class TestDylib(BaseTest):
From 83d437cf01d3c162bb79dda74a5ba76b8d000b58 Mon Sep 17 00:00:00 2001
From: Andre Masella <andre@masella.name>
Date: Wed, 23 Mar 2022 15:33:38 -0400
Subject: [PATCH 2/6] Rename some passes
Make pass names more consistent
---
ffi/passmanagers.cpp | 16 +++++------
llvmlite/binding/passmanagers.py | 47 ++++++++++++++++----------------
llvmlite/tests/test_binding.py | 5 ++--
3 files changed, 35 insertions(+), 33 deletions(-)
diff --git a/ffi/passmanagers.cpp b/ffi/passmanagers.cpp
index a1fb0b880..d6493eb13 100644
--- a/ffi/passmanagers.cpp
+++ b/ffi/passmanagers.cpp
@@ -91,7 +91,7 @@ LLVMPY_AddAAEvalPass(LLVMPassManagerRef PM) {
}
API_EXPORT(void)
-LLVMPY_AddBasicAAPass(LLVMPassManagerRef PM) {
+LLVMPY_AddBasicAAWrapperPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createBasicAAWrapperPass());
}
@@ -106,7 +106,7 @@ LLVMPY_AddCallGraphViewerPass(LLVMPassManagerRef PM) {
}
API_EXPORT(void)
-LLVMPY_AddDotCallGraphPass(LLVMPassManagerRef PM) {
+LLVMPY_AddCallGraphDOTPrinterPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createCallGraphDOTPrinterPass());
}
@@ -138,17 +138,17 @@ LLVMPY_AddConstantMergePass(LLVMPassManagerRef PM) {
}
API_EXPORT(void)
-LLVMPY_AddDeadInstructionEliminationPrinterPass(LLVMPassManagerRef PM) {
+LLVMPY_AddDeadInstructionEliminationPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createDeadInstEliminationPass());
}
API_EXPORT(void)
-LLVMPY_AddDeadStoreEliminationPrinterPass(LLVMPassManagerRef PM) {
+LLVMPY_AddDeadStoreEliminationPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createDeadStoreEliminationPass());
}
API_EXPORT(void)
-LLVMPY_AddPostOrderFunctionAttrsPass(LLVMPassManagerRef PM) {
+LLVMPY_AddReversePostOrderFunctionAttrsPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createReversePostOrderFunctionAttrsPass());
}
@@ -176,7 +176,7 @@ LLVMPY_AddLintPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createLintPass());
}
API_EXPORT(void)
-LLVMPY_AddModuleDebugInfoPass(LLVMPassManagerRef PM) {
+LLVMPY_AddModuleDebugInfoPrinterPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createModuleDebugInfoPrinterPass());
}
@@ -196,7 +196,7 @@ LLVMPY_AddAggressiveDCEPass(LLVMPassManagerRef PM) {
}
API_EXPORT(void)
-LLVMPY_AddAlwaysInlinePass(LLVMPassManagerRef PM, bool insertLifetime) {
+LLVMPY_AddAlwaysInlinerPass(LLVMPassManagerRef PM, bool insertLifetime) {
unwrap(PM)->add(llvm::createAlwaysInlinerLegacyPass(insertLifetime));
}
@@ -206,7 +206,7 @@ LLVMPY_AddArgPromotionPass(LLVMPassManagerRef PM, unsigned int maxElements) {
}
API_EXPORT(void)
-LLVMPY_AddBreakCritEdgesPass(LLVMPassManagerRef PM) {
+LLVMPY_AddBreakCriticalEdgesPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createBreakCriticalEdgesPass());
}
diff --git a/llvmlite/binding/passmanagers.py b/llvmlite/binding/passmanagers.py
index 3601f5f9f..f0420e534 100644
--- a/llvmlite/binding/passmanagers.py
+++ b/llvmlite/binding/passmanagers.py
@@ -110,7 +110,7 @@ def add_aa_eval_pass(self):
def add_basic_aa_pass(self):
"""See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl.""" # noqa E501
- ffi.lib.LLVMPY_AddBasicAAPass(self)
+ ffi.lib.LLVMPY_AddBasicAAWrapperPass(self)
def add_constant_merge_pass(self):
"""See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants.""" # noqa E501
@@ -126,10 +126,10 @@ def add_dependence_analysis_pass(self):
def add_dot_call_graph_pass(self):
"""See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file""" # noqa E501
- ffi.lib.LLVMPY_AddDotCallGraphPass(self)
+ ffi.lib.LLVMPY_AddCallGraphDOTPrinterPass(self)
def add_dot_cfg_printer_pass(self):
- """See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file""" # noqa E501
+ """See https://llvm.org/docs/Passes.html#dot-cfg-print-cfg-of-function-to-dot-file""" # noqa E501
ffi.lib.LLVMPY_AddCallGraphViewerPass(self)
def add_dot_dom_printer_pass(self, show_body=False):
@@ -149,7 +149,7 @@ def add_iv_users_pass(self):
ffi.lib.LLVMPY_AddIVUsersPass(self)
def add_lint_pass(self):
- """See https://llvm.org/docs/Passes.html#libcall-aa-libcall-alias-analysis""" # noqa E501
+ """See https://llvm.org/docs/Passes.html#lint-statically-lint-checks-llvm-ir""" # noqa E501
ffi.lib.LLVMPY_AddLintPass(self)
def add_lazy_value_info_pass(self):
@@ -161,8 +161,8 @@ def add_intervals_pass(self):
ffi.lib.LLVMPY_AddIntervalsPass(self)
def add_module_debug_info_pass(self):
- """See https://llvm.org/docs/Passes.html#intervals-interval-partition-construction""" # noqa E501
- ffi.lib.LLVMPY_AddModuleDebugInfoPass(self)
+ """See https://llvm.org/docs/Passes.html#module-debuginfo-decodes-module-level-debug-info""" # noqa E501
+ ffi.lib.LLVMPY_AddModuleDebugInfoPrinterPass(self)
def add_region_info_pass(self):
"""See https://llvm.org/docs/Passes.html#regions-detect-single-entry-single-exit-regions""" # noqa E501
@@ -176,29 +176,29 @@ def add_aggressive_dead_code_elimination_pass(self):
"""See https://llvm.org/docs/Passes.html#adce-aggressive-dead-code-elimination""" # noqa E501
ffi.lib.LLVMPY_AddAggressiveDCEPass(self)
- def add_always_inline_pass(self, insert_lifetime=True):
+ def add_always_inliner_pass(self, insert_lifetime=True):
"""See https://llvm.org/docs/Passes.html#always-inline-inliner-for-always-inline-functions""" # noqa E501
- ffi.lib.LLVMPY_AddAlwaysInlinePass(self, insert_lifetime)
+ ffi.lib.LLVMPY_AddAlwaysInlinerPass(self, insert_lifetime)
- def add_arg_promotion_pass(self, max_elements):
+ def add_arg_promotion_pass(self, max_elements=3):
"""See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars""" # noqa E501
ffi.lib.LLVMPY_AddArgPromotionPass(self, max_elements)
def add_break_critical_edges_pass(self):
"""See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg""" # noqa E501
- ffi.lib.LLVMPY_AddBreakCritEdgesPass(self)
+ ffi.lib.LLVMPY_AddBreakCriticalEdgesPass(self)
def add_dead_instruction_elimination_pass(self):
"""See https://llvm.org/docs/Passes.html#die-dead-instruction-elimination""" # noqa E501
- ffi.lib.LLVMPY_AddDeadInstructionEliminationPrinterPass(self)
+ ffi.lib.LLVMPY_AddDeadInstructionEliminationPass(self)
def add_dead_store_elimination_pass(self):
"""See https://llvm.org/docs/Passes.html#dse-dead-store-elimination""" # noqa E501
- ffi.lib.LLVMPY_AddDeadStoreEliminationPrinterPass(self)
+ ffi.lib.LLVMPY_AddDeadStoreEliminationPass(self)
def add_post_order_function_attrs_pass(self):
"""See https://llvm.org/docs/Passes.html#function-attrs-deduce-function-attributes""" # noqa E501
- ffi.lib.LLVMPY_AddPostOrderFunctionAttrsPass(self)
+ ffi.lib.LLVMPY_AddReversePostOrderFunctionAttrsPass(self)
def add_function_attrs_pass(self):
"""See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes.""" # noqa E501
@@ -236,7 +236,7 @@ def add_cfg_simplification_pass(self):
"""See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg."""
ffi.lib.LLVMPY_AddCFGSimplificationPass(self)
- def add_jump_threading_pass(self, threshold):
+ def add_jump_threading_pass(self, threshold=-1):
"""See https://llvm.org/docs/Passes.html#jump-threading-jump-threading""" # noqa E501
ffi.lib.LLVMPY_AddJumpThreadingPass(self, threshold)
@@ -328,7 +328,7 @@ def add_prune_exception_handling_pass(self):
"""See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info""" # noqa E501
ffi.lib.LLVMPY_AddPruneExceptionHandlingPass(self)
- def add_reassociate_pass(self):
+ def add_reassociate_expressions_pass(self):
"""See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions""" # noqa E501
ffi.lib.LLVMPY_AddReassociatePass(self)
@@ -469,11 +469,11 @@ def run(self, function):
ffi.lib.LLVMPY_RunFunctionPassManager.restype = c_bool
ffi.lib.LLVMPY_AddAAEvalPass.argtypes = [ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddBasicAAPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddBasicAAWrapperPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddConstantMergePass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddDeadArgEliminationPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddDependenceAnalysisPass.argtypes = [ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddDotCallGraphPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddCallGraphDOTPrinterPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddCallGraphViewerPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddDotDomPrinterPass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
ffi.lib.LLVMPY_AddDotPostDomPrinterPass.argtypes = [
@@ -484,18 +484,19 @@ def run(self, function):
ffi.lib.LLVMPY_AddIVUsersPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddLazyValueInfoPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddLintPass.argtypes = [ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddModuleDebugInfoPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddModuleDebugInfoPrinterPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddRegionInfoPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddScalarEvolutionAAPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddAggressiveDCEPass.argtypes = [ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddAlwaysInlinePass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
+ffi.lib.LLVMPY_AddAlwaysInlinerPass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
ffi.lib.LLVMPY_AddArgPromotionPass.argtypes = [ffi.LLVMPassManagerRef, c_uint]
-ffi.lib.LLVMPY_AddBreakCritEdgesPass.argtypes = [ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddDeadInstructionEliminationPrinterPass.argtypes = [
+ffi.lib.LLVMPY_AddBreakCriticalEdgesPass.argtypes = [ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDeadInstructionEliminationPass.argtypes = [
+ ffi.LLVMPassManagerRef]
+ffi.lib.LLVMPY_AddDeadStoreEliminationPass.argtypes = [
ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddDeadStoreEliminationPrinterPass.argtypes = [
+ffi.lib.LLVMPY_AddReversePostOrderFunctionAttrsPass.argtypes = [
ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddPostOrderFunctionAttrsPass.argtypes = [ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddAggressiveInstructionCombiningPass.argtypes = [
ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddInternalizePass.argtypes = [ffi.LLVMPassManagerRef]
diff --git a/llvmlite/tests/test_binding.py b/llvmlite/tests/test_binding.py
index 035b720bc..501b46c17 100644
--- a/llvmlite/tests/test_binding.py
+++ b/llvmlite/tests/test_binding.py
@@ -1410,7 +1410,8 @@ def test_populate(self):
pm.add_region_info_pass()
pm.add_scalar_evolution_aa_pass()
pm.add_aggressive_dead_code_elimination_pass()
- pm.add_always_inline_pass()
+ pm.add_aa_eval_pass()
+ pm.add_always_inliner_pass()
pm.add_arg_promotion_pass(42)
pm.add_break_critical_edges_pass()
pm.add_dead_instruction_elimination_pass()
@@ -1436,7 +1437,7 @@ def test_populate(self):
pm.add_merge_returns_pass()
pm.add_partial_inlining_pass()
pm.add_prune_exception_handling_pass()
- pm.add_reassociate_pass()
+ pm.add_reassociate_expressions_pass()
pm.add_demote_register_to_memory_pass()
pm.add_sink_pass()
pm.add_strip_symbols_pass()
From e1b0d27c1d2bcabbead790aeea9c299a74faca8c Mon Sep 17 00:00:00 2001
From: Andre Masella <andre@masella.name>
Date: Wed, 23 Mar 2022 15:50:21 -0400
Subject: [PATCH 3/6] Add formatting checker for C++
Use clang-format from Azure pipelines to check formatting of C++ code.
---
azure-pipelines.yml | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 19e1851ad..ad481334d 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -68,3 +68,13 @@ jobs:
parameters:
name: Windows
vmImage: windows-2019
+
+- job: check_formatting
+ pool:
+ vmImage: 'ubuntu-latest'
+ steps:
+ - script: |
+ set -e
+ sudo apt install -y clang-format
+ clang-format -n -Werror ffi/*.cpp ffi/*.h
+ displayName: Check C++ formatting
From d8d17fda497b782a40f8ec4c6df233aea0791893 Mon Sep 17 00:00:00 2001
From: Andre Masella <andre@masella.name>
Date: Tue, 5 Apr 2022 15:22:21 -0400
Subject: [PATCH 5/6] Update to LLVM 12-13
Modify llvmlite to support LLVM 11-13 and modify conda recipe to build LLVM13.
Also lift over all patches to LLVM versions as required.
---
...-Limit-size-of-non-GlobalValue-name.patch} | 0
...tch => llvm11-consecutive_registers.patch} | 0
...-entrypoints-in-add-TLI-mappings.ll.patch} | 0
...atch => llvm11-intel-D47188-svml-VF.patch} | 0
...o-static.patch => llvm11-lto-static.patch} | 0
...ing.patch => llvm11-partial-testing.patch} | 0
...t-Limit-size-of-non-GlobalValue-name.patch | 49 +++++
.../llvm12-consecutive_registers.patch | 181 ++++++++++++++++++
conda-recipes/llvm12-lto-static.patch | 12 ++
conda-recipes/llvm13-lto-static.patch | 12 ++
conda-recipes/llvmdev/build.sh | 1 +
conda-recipes/llvmdev/meta.yaml | 18 +-
ffi/Makefile.freebsd | 2 +-
ffi/Makefile.osx | 4 +-
ffi/build.py | 7 +-
ffi/passmanagers.cpp | 9 +-
ffi/targets.cpp | 4 +
ffi/value.cpp | 13 +-
llvmlite/binding/passmanagers.py | 6 -
llvmlite/tests/test_binding.py | 3 +-
20 files changed, 287 insertions(+), 34 deletions(-)
rename conda-recipes/{0001-Revert-Limit-size-of-non-GlobalValue-name.patch => llvm11-0001-Revert-Limit-size-of-non-GlobalValue-name.patch} (100%)
rename conda-recipes/{llvm_11_consecutive_registers.patch => llvm11-consecutive_registers.patch} (100%)
rename conda-recipes/{expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch => llvm11-expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch} (100%)
rename conda-recipes/{intel-D47188-svml-VF.patch => llvm11-intel-D47188-svml-VF.patch} (100%)
rename conda-recipes/{llvm-lto-static.patch => llvm11-lto-static.patch} (100%)
rename conda-recipes/{partial-testing.patch => llvm11-partial-testing.patch} (100%)
create mode 100644 conda-recipes/llvm12-0001-Revert-Limit-size-of-non-GlobalValue-name.patch
create mode 100644 conda-recipes/llvm12-consecutive_registers.patch
create mode 100644 conda-recipes/llvm12-lto-static.patch
create mode 100644 conda-recipes/llvm13-lto-static.patch
diff --git a/conda-recipes/0001-Revert-Limit-size-of-non-GlobalValue-name.patch b/conda-recipes/llvm11-0001-Revert-Limit-size-of-non-GlobalValue-name.patch
similarity index 100%
rename from conda-recipes/0001-Revert-Limit-size-of-non-GlobalValue-name.patch
rename to conda-recipes/llvm11-0001-Revert-Limit-size-of-non-GlobalValue-name.patch
diff --git a/conda-recipes/llvm_11_consecutive_registers.patch b/conda-recipes/llvm11-consecutive_registers.patch
similarity index 100%
rename from conda-recipes/llvm_11_consecutive_registers.patch
rename to conda-recipes/llvm11-consecutive_registers.patch
diff --git a/conda-recipes/expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch b/conda-recipes/llvm11-expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch
similarity index 100%
rename from conda-recipes/expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch
rename to conda-recipes/llvm11-expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch
diff --git a/conda-recipes/intel-D47188-svml-VF.patch b/conda-recipes/llvm11-intel-D47188-svml-VF.patch
similarity index 100%
rename from conda-recipes/intel-D47188-svml-VF.patch
rename to conda-recipes/llvm11-intel-D47188-svml-VF.patch
diff --git a/conda-recipes/llvm-lto-static.patch b/conda-recipes/llvm11-lto-static.patch
similarity index 100%
rename from conda-recipes/llvm-lto-static.patch
rename to conda-recipes/llvm11-lto-static.patch
diff --git a/conda-recipes/partial-testing.patch b/conda-recipes/llvm11-partial-testing.patch
similarity index 100%
rename from conda-recipes/partial-testing.patch
rename to conda-recipes/llvm11-partial-testing.patch
diff --git a/conda-recipes/llvm12-0001-Revert-Limit-size-of-non-GlobalValue-name.patch b/conda-recipes/llvm12-0001-Revert-Limit-size-of-non-GlobalValue-name.patch
new file mode 100644
index 000000000..9b722d36c
--- /dev/null
+++ b/conda-recipes/llvm12-0001-Revert-Limit-size-of-non-GlobalValue-name.patch
@@ -0,0 +1,49 @@
+diff -ur a/lib/IR/Value.cpp b/lib/IR/Value.cpp
+--- a/lib/IR/Value.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/IR/Value.cpp 2022-03-31 15:39:31.000000000 -0400
+@@ -38,10 +38,6 @@
+
+ using namespace llvm;
+
+-static cl::opt<unsigned> NonGlobalValueMaxNameSize(
+- "non-global-value-max-name-size", cl::Hidden, cl::init(1024),
+- cl::desc("Maximum size for the name of non-global values."));
+-
+ //===----------------------------------------------------------------------===//
+ // Value Class
+ //===----------------------------------------------------------------------===//
+@@ -319,11 +315,6 @@
+ if (getName() == NameRef)
+ return;
+
+- // Cap the size of non-GlobalValue names.
+- if (NameRef.size() > NonGlobalValueMaxNameSize && !isa<GlobalValue>(this))
+- NameRef =
+- NameRef.substr(0, std::max(1u, (unsigned)NonGlobalValueMaxNameSize));
+-
+ assert(!getType()->isVoidTy() && "Cannot assign a name to void values!");
+
+ // Get the symbol table to update for this object.
+diff -ur a/test/Bitcode/value-with-long-name.ll b/test/Bitcode/value-with-long-name.ll
+deleted file mode 1000644
+--- a/test/Bitcode/value-with-long-name.ll
++++ /dev/null
+@@ -1,18 +0,0 @@
+-; Check the size of generated variable when no option is set
+-; RUN: opt -S %s -O2 -o - | FileCheck -check-prefix=CHECK-LONG %s
+-; CHECK-LONG: %{{[a-z]{4}[a-z]+}}
+-
+-; Then check we correctly cap the size of newly generated non-global values name
+-; Force the size to be small so that the check works on release and debug build
+-; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=0 | FileCheck -check-prefix=CHECK-SHORT %s
+-; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=1 | FileCheck -check-prefix=CHECK-SHORT %s
+-; CHECK-SHORT-NOT: %{{[a-z][a-z]+}}
+-
+-define i32 @f(i32 %a, i32 %b) {
+- %c = add i32 %a, %b
+- %d = add i32 %c, %a
+- %e = add i32 %d, %b
+- ret i32 %e
+-}
+-
+-
diff --git a/conda-recipes/llvm12-consecutive_registers.patch b/conda-recipes/llvm12-consecutive_registers.patch
new file mode 100644
index 000000000..cc60217bd
--- /dev/null
+++ b/conda-recipes/llvm12-consecutive_registers.patch
@@ -0,0 +1,181 @@
+diff -ur a/include/llvm/CodeGen/TargetLowering.h b/include/llvm/CodeGen/TargetLowering.h
+--- a/include/llvm/CodeGen/TargetLowering.h 2021-04-06 12:38:18.000000000 -0400
++++ b/include/llvm/CodeGen/TargetLowering.h 2022-03-31 15:52:45.000000000 -0400
+@@ -3975,7 +3975,8 @@
+ /// must be passed in a block of consecutive registers.
+ virtual bool
+ functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv,
+- bool isVarArg) const {
++ bool isVarArg,
++ const DataLayout &DL) const {
+ return false;
+ }
+
+diff -ur a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp
+--- a/lib/CodeGen/SelectionDAG/FastISel.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/CodeGen/SelectionDAG/FastISel.cpp 2022-03-31 15:52:45.000000000 -0400
+@@ -1087,7 +1087,7 @@
+ if (Arg.IsByVal)
+ FinalType = cast<PointerType>(Arg.Ty)->getElementType();
+ bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
+- FinalType, CLI.CallConv, CLI.IsVarArg);
++ FinalType, CLI.CallConv, CLI.IsVarArg, DL);
+
+ ISD::ArgFlagsTy Flags;
+ if (Arg.IsZExt)
+diff -ur a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+--- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp 2022-03-31 15:52:45.000000000 -0400
+@@ -1851,7 +1851,7 @@
+
+ bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
+ I.getOperand(0)->getType(), F->getCallingConv(),
+- /*IsVarArg*/ false);
++ /*IsVarArg*/ false, DL);
+
+ ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
+ if (F->getAttributes().hasAttribute(AttributeList::ReturnIndex,
+@@ -9229,7 +9229,7 @@
+ CLI.IsTailCall = false;
+ } else {
+ bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
+- CLI.RetTy, CLI.CallConv, CLI.IsVarArg);
++ CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
+ for (unsigned I = 0, E = RetTys.size(); I != E; ++I) {
+ ISD::ArgFlagsTy Flags;
+ if (NeedsRegBlock) {
+@@ -9289,7 +9289,7 @@
+ if (Args[i].IsByVal)
+ FinalType = cast<PointerType>(Args[i].Ty)->getElementType();
+ bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
+- FinalType, CLI.CallConv, CLI.IsVarArg);
++ FinalType, CLI.CallConv, CLI.IsVarArg, DL);
+ for (unsigned Value = 0, NumValues = ValueVTs.size(); Value != NumValues;
+ ++Value) {
+ EVT VT = ValueVTs[Value];
+@@ -9830,7 +9830,7 @@
+ if (Arg.hasAttribute(Attribute::ByVal))
+ FinalType = Arg.getParamByValType();
+ bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
+- FinalType, F.getCallingConv(), F.isVarArg());
++ FinalType, F.getCallingConv(), F.isVarArg(), DL);
+ for (unsigned Value = 0, NumValues = ValueVTs.size();
+ Value != NumValues; ++Value) {
+ EVT VT = ValueVTs[Value];
+diff -ur a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp
+--- a/lib/Target/AArch64/AArch64ISelLowering.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/AArch64/AArch64ISelLowering.cpp 2022-03-31 15:52:45.000000000 -0400
+@@ -30,6 +30,7 @@
+ #include "llvm/ADT/Triple.h"
+ #include "llvm/ADT/Twine.h"
+ #include "llvm/Analysis/VectorUtils.h"
++#include "llvm/CodeGen/Analysis.h"
+ #include "llvm/CodeGen/CallingConvLower.h"
+ #include "llvm/CodeGen/MachineBasicBlock.h"
+ #include "llvm/CodeGen/MachineFrameInfo.h"
+@@ -16455,15 +16456,17 @@
+ }
+
+ bool AArch64TargetLowering::functionArgumentNeedsConsecutiveRegisters(
+- Type *Ty, CallingConv::ID CallConv, bool isVarArg) const {
+- if (Ty->isArrayTy())
+- return true;
+-
+- const TypeSize &TySize = Ty->getPrimitiveSizeInBits();
+- if (TySize.isScalable() && TySize.getKnownMinSize() > 128)
+- return true;
++ Type *Ty, CallingConv::ID CallConv, bool isVarArg,
++ const DataLayout &DL) const {
++ if (!Ty->isArrayTy()) {
++ const TypeSize &TySize = Ty->getPrimitiveSizeInBits();
++ return TySize.isScalable() && TySize.getKnownMinSize() > 128;
++ }
+
+- return false;
++ // All non aggregate members of the type must have the same type
++ SmallVector<EVT, 0> ValueVTs;
++ ComputeValueVTs(*this, DL, Ty, ValueVTs);
++ return is_splat(ValueVTs);
+ }
+
+ bool AArch64TargetLowering::shouldNormalizeToSelectSequence(LLVMContext &,
+diff -ur a/lib/Target/AArch64/AArch64ISelLowering.h b/lib/Target/AArch64/AArch64ISelLowering.h
+--- a/lib/Target/AArch64/AArch64ISelLowering.h 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/AArch64/AArch64ISelLowering.h 2022-03-31 15:52:45.000000000 -0400
+@@ -770,9 +770,10 @@
+ MachineMemOperand::Flags getTargetMMOFlags(
+ const Instruction &I) const override;
+
+- bool functionArgumentNeedsConsecutiveRegisters(Type *Ty,
+- CallingConv::ID CallConv,
+- bool isVarArg) const override;
++ bool functionArgumentNeedsConsecutiveRegisters(
++ Type *Ty, CallingConv::ID CallConv, bool isVarArg,
++ const DataLayout &DL) const override;
++
+ /// Used for exception handling on Win64.
+ bool needsFixedCatchObjects() const override;
+
+diff -ur a/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
+--- a/lib/Target/AArch64/GISel/AArch64CallLowering.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/AArch64/GISel/AArch64CallLowering.cpp 2022-03-31 15:52:45.000000000 -0400
+@@ -259,7 +259,7 @@
+ assert(OrigArg.Regs.size() == SplitVTs.size() && "Regs / types mismatch");
+
+ bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
+- OrigArg.Ty, CallConv, false);
++ OrigArg.Ty, CallConv, false, DL);
+ for (unsigned i = 0, e = SplitVTs.size(); i < e; ++i) {
+ Type *SplitTy = SplitVTs[i].getTypeForEVT(Ctx);
+ SplitArgs.emplace_back(OrigArg.Regs[i], SplitTy, OrigArg.Flags[0],
+diff -ur a/lib/Target/ARM/ARMCallLowering.cpp b/lib/Target/ARM/ARMCallLowering.cpp
+--- a/lib/Target/ARM/ARMCallLowering.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/ARM/ARMCallLowering.cpp 2022-03-31 15:52:45.000000000 -0400
+@@ -218,7 +218,7 @@
+
+ bool NeedsConsecutiveRegisters =
+ TLI.functionArgumentNeedsConsecutiveRegisters(
+- SplitTy, F.getCallingConv(), F.isVarArg());
++ SplitTy, F.getCallingConv(), F.isVarArg(), DL);
+ if (NeedsConsecutiveRegisters) {
+ Flags.setInConsecutiveRegs();
+ if (i == e - 1)
+diff -ur a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp
+--- a/lib/Target/ARM/ARMISelLowering.cpp 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/ARM/ARMISelLowering.cpp 2022-03-31 15:52:45.000000000 -0400
+@@ -19269,7 +19269,8 @@
+ /// [N x i32] or [N x i64]. This allows front-ends to skip emitting padding when
+ /// passing according to AAPCS rules.
+ bool ARMTargetLowering::functionArgumentNeedsConsecutiveRegisters(
+- Type *Ty, CallingConv::ID CallConv, bool isVarArg) const {
++ Type *Ty, CallingConv::ID CallConv, bool isVarArg,
++ const DataLayout &DL) const {
+ if (getEffectiveCallingConv(CallConv, isVarArg) !=
+ CallingConv::ARM_AAPCS_VFP)
+ return false;
+diff -ur a/lib/Target/ARM/ARMISelLowering.h b/lib/Target/ARM/ARMISelLowering.h
+--- a/lib/Target/ARM/ARMISelLowering.h 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/ARM/ARMISelLowering.h 2022-03-31 15:52:45.000000000 -0400
+@@ -578,7 +578,8 @@
+ /// Returns true if an argument of type Ty needs to be passed in a
+ /// contiguous block of registers in calling convention CallConv.
+ bool functionArgumentNeedsConsecutiveRegisters(
+- Type *Ty, CallingConv::ID CallConv, bool isVarArg) const override;
++ Type *Ty, CallingConv::ID CallConv, bool isVarArg,
++ const DataLayout &DL) const override;
+
+ /// If a physical register, this returns the register that receives the
+ /// exception address on entry to an EH pad.
+diff -ur a/lib/Target/PowerPC/PPCISelLowering.h b/lib/Target/PowerPC/PPCISelLowering.h
+--- a/lib/Target/PowerPC/PPCISelLowering.h 2021-04-06 12:38:18.000000000 -0400
++++ b/lib/Target/PowerPC/PPCISelLowering.h 2022-03-31 15:52:45.000000000 -0400
+@@ -998,7 +998,8 @@
+ /// Returns true if an argument of type Ty needs to be passed in a
+ /// contiguous block of registers in calling convention CallConv.
+ bool functionArgumentNeedsConsecutiveRegisters(
+- Type *Ty, CallingConv::ID CallConv, bool isVarArg) const override {
++ Type *Ty, CallingConv::ID CallConv, bool isVarArg,
++ const DataLayout &DL) const override {
+ // We support any array type as "consecutive" block in the parameter
+ // save area. The element type defines the alignment requirement and
+ // whether the argument should go in GPRs, FPRs, or VRs if available.
diff --git a/conda-recipes/llvm12-lto-static.patch b/conda-recipes/llvm12-lto-static.patch
new file mode 100644
index 000000000..76cc55def
--- /dev/null
+++ b/conda-recipes/llvm12-lto-static.patch
@@ -0,0 +1,12 @@
+diff -ur a/tools/lto/CMakeLists.txt b/tools/lto/CMakeLists.txt
+--- llvm-12.0.0.src-orig/tools/lto/CMakeLists.txt 2021-04-06 12:38:18.000000000 -0400
++++ llvm-12.0.0.src/tools/lto/CMakeLists.txt 2022-03-31 15:46:00.000000000 -0400
+@@ -21,7 +21,7 @@
+
+ set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/lto.exports)
+
+-add_llvm_library(LTO SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS
++add_llvm_library(LTO INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS
+ intrinsics_gen)
+
+ install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/lto.h
diff --git a/conda-recipes/llvm13-lto-static.patch b/conda-recipes/llvm13-lto-static.patch
new file mode 100644
index 000000000..b8a624250
--- /dev/null
+++ b/conda-recipes/llvm13-lto-static.patch
@@ -0,0 +1,12 @@
+diff -ur llvm-13.0.0.src-orig/tools/lto/CMakeLists.txt llvm-13.0.0.src/tools/lto/CMakeLists.txt
+--- llvm-13.0.0.src-orig/tools/lto/CMakeLists.txt 2021-09-24 12:18:10.000000000 -0400
++++ llvm-13.0.0.src/tools/lto/CMakeLists.txt 2022-03-31 17:07:07.000000000 -0400
+@@ -25,7 +25,7 @@
+ set(LTO_LIBRARY_TYPE MODULE)
+ set(LTO_LIBRARY_NAME libLTO)
+ else()
+- set(LTO_LIBRARY_TYPE SHARED)
++ set(LTO_LIBRARY_TYPE STATIC)
+ set(LTO_LIBRARY_NAME LTO)
+ endif()
+
diff --git a/conda-recipes/llvmdev/build.sh b/conda-recipes/llvmdev/build.sh
index fd99eee90..d187f6482 100644
--- a/conda-recipes/llvmdev/build.sh
+++ b/conda-recipes/llvmdev/build.sh
@@ -39,6 +39,7 @@ _cmake_config+=(-DLLVM_ENABLE_RTTI=OFF)
_cmake_config+=(-DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS_TO_BUILD})
_cmake_config+=(-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly)
_cmake_config+=(-DLLVM_INCLUDE_UTILS=ON) # for llvm-lit
+_cmake_config+=(-DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF) # doesn't build without the rest of LLVM project
# TODO :: It would be nice if we had a cross-ecosystem 'BUILD_TIME_LIMITED' env var we could use to
# disable these unnecessary but useful things.
if [[ ${CONDA_FORGE} == yes ]]; then
diff --git a/conda-recipes/llvmdev/meta.yaml b/conda-recipes/llvmdev/meta.yaml
index 27b596ffc..9c9376bb0 100644
--- a/conda-recipes/llvmdev/meta.yaml
+++ b/conda-recipes/llvmdev/meta.yaml
@@ -1,7 +1,7 @@
-{% set shortversion = "11.1" %}
-{% set version = "11.1.0" %}
-{% set sha256_llvm = "ce8508e318a01a63d4e8b3090ab2ded3c598a50258cc49e2625b9120d4c03ea5" %}
-{% set sha256_lld = "017a788cbe1ecc4a949abf10755870519086d058a2e99f438829aef24f0c66ce" %}
+{% set shortversion = "13.0" %}
+{% set version = "13.0.1" %}
+{% set sha256_llvm = "ec6b80d82c384acad2dc192903a6cf2cdbaffb889b84bfb98da9d71e630fc834" %}
+{% set sha256_lld = "666af745e8bf7b680533b4d18b7a31dc7cab575b1e6e4d261922bbafd9644cfb" %}
{% set build_number = "5" %}
package:
@@ -13,15 +13,7 @@ source:
fn: llvm-{{ version }}.src.tar.xz
sha256: {{ sha256_llvm }}
patches:
- - ../partial-testing.patch
- # Intel SVML optimizations (two patches)
- - ../intel-D47188-svml-VF.patch
- # Second patch from https://github.com/conda-forge/llvmdev-feedstock/blob/c706309/recipe/patches/expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch
- - ../expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch
- # Reverts a patch limiting non-GlobalValue name length
- - ../0001-Revert-Limit-size-of-non-GlobalValue-name.patch
- # Fixes for aarch64 on LLVM 11 from https://reviews.llvm.org/D104123
- - ../llvm_11_consecutive_registers.patch
+ - ../llvm13-lto-static.patch
- url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/lld-{{ version }}.src.tar.xz
fn: lld-{{ version }}.src.tar.xz
diff --git a/ffi/Makefile.freebsd b/ffi/Makefile.freebsd
index ba727e331..7b869e876 100644
--- a/ffi/Makefile.freebsd
+++ b/ffi/Makefile.freebsd
@@ -1,5 +1,5 @@
-CXX = clang++ -std=c++11 -stdlib=libc++
+CXX = clang++ -stdlib=libc++
# -flto and --exclude-libs allow us to remove those parts of LLVM we don't use
CXX_FLTO_FLAGS ?= -flto
diff --git a/ffi/Makefile.osx b/ffi/Makefile.osx
index bc192071e..74dccf32c 100644
--- a/ffi/Makefile.osx
+++ b/ffi/Makefile.osx
@@ -1,6 +1,6 @@
-CXX = clang++ -std=c++11 -stdlib=libc++
-CXXFLAGS = $(LLVM_CXXFLAGS)
+CXX = clang++
+CXXFLAGS = $(LLVM_CXXFLAGS) -O3
# Only export the LLVMPY symbols we require and exclude everything else.
EXPORT = "-Wl,-exported_symbol,_LLVMPY_*"
LDFLAGS := $(LDFLAGS) $(EXPORT) $(LLVM_LDFLAGS)
diff --git a/ffi/build.py b/ffi/build.py
index 55343fca5..e830342eb 100755
--- a/ffi/build.py
+++ b/ffi/build.py
@@ -163,9 +163,10 @@ def main_posix(kind, library_ext):
print(msg)
print(warning + '\n')
else:
-
- if not out.startswith('11'):
- msg = ("Building llvmlite requires LLVM 11.x.x, got "
+ (version, _) = out.split('.', 1)
+ version = int(version)
+ if version < 11 or version > 13:
+ msg = ("Building llvmlite requires LLVM 11, 12, or 13, got "
"{!r}. Be sure to set LLVM_CONFIG to the right executable "
"path.\nRead the documentation at "
"http://llvmlite.pydata.org/ for more information about "
diff --git a/ffi/passmanagers.cpp b/ffi/passmanagers.cpp
index d6493eb13..00e99d485 100644
--- a/ffi/passmanagers.cpp
+++ b/ffi/passmanagers.cpp
@@ -137,11 +137,6 @@ LLVMPY_AddConstantMergePass(LLVMPassManagerRef PM) {
LLVMAddConstantMergePass(PM);
}
-API_EXPORT(void)
-LLVMPY_AddDeadInstructionEliminationPass(LLVMPassManagerRef PM) {
- unwrap(PM)->add(llvm::createDeadInstEliminationPass());
-}
-
API_EXPORT(void)
LLVMPY_AddDeadStoreEliminationPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(llvm::createDeadStoreEliminationPass());
@@ -173,7 +168,11 @@ LLVMPY_AddLazyValueInfoPass(LLVMPassManagerRef PM) {
}
API_EXPORT(void)
LLVMPY_AddLintPass(LLVMPassManagerRef PM) {
+#if LLVM_VERSION_MAJOR < 12
unwrap(PM)->add(llvm::createLintPass());
+#else
+ unwrap(PM)->add(llvm::createLintLegacyPassPass());
+#endif
}
API_EXPORT(void)
LLVMPY_AddModuleDebugInfoPrinterPass(LLVMPassManagerRef PM) {
diff --git a/ffi/targets.cpp b/ffi/targets.cpp
index 2ee892023..42fe46f2c 100644
--- a/ffi/targets.cpp
+++ b/ffi/targets.cpp
@@ -204,7 +204,11 @@ LLVMPY_CreateTargetMachine(LLVMTargetRef T, const char *Triple, const char *CPU,
rm = Reloc::DynamicNoPIC;
TargetOptions opt;
+#if LLVM_VERSION_MAJOR < 12
opt.PrintMachineCode = PrintMC;
+#else
+ opt.MCOptions.ShowMCInst = PrintMC;
+#endif
opt.MCOptions.ABIName = ABIName;
bool jit = JIT;
diff --git a/ffi/value.cpp b/ffi/value.cpp
index e8222ca5b..dba16409e 100644
--- a/ffi/value.cpp
+++ b/ffi/value.cpp
@@ -152,8 +152,13 @@ LLVMPY_ArgumentAttributesIter(LLVMValueRef A) {
using namespace llvm;
Argument* arg = unwrap<Argument>(A);
unsigned argno = arg->getArgNo();
- AttributeSet attrs = arg->getParent()
- ->getAttributes().getParamAttributes(argno);
+ const AttributeSet attrs = arg->getParent()->getAttributes().
+#if LLVM_VERSION_MAJOR < 14
+ getParamAttributes(argno)
+#else
+ getParamAttrs(argno)
+#endif
+ ;
return wrap(new AttributeSetIterator(attrs.begin(),
attrs.end()));
}
@@ -352,7 +357,11 @@ LLVMPY_GetElementType(LLVMTypeRef type) {
llvm::Type* unwrapped = llvm::unwrap(type);
llvm::PointerType* ty = llvm::dyn_cast<llvm::PointerType>(unwrapped);
if (ty != nullptr) {
+#if LLVM_VERSION_MAJOR < 14
return llvm::wrap(ty->getElementType());
+#else
+ return llvm::wrap(ty->getPointerElementType());
+#endif
}
return nullptr;
}
diff --git a/llvmlite/binding/passmanagers.py b/llvmlite/binding/passmanagers.py
index f0420e534..fd062ade8 100644
--- a/llvmlite/binding/passmanagers.py
+++ b/llvmlite/binding/passmanagers.py
@@ -188,10 +188,6 @@ def add_break_critical_edges_pass(self):
"""See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg""" # noqa E501
ffi.lib.LLVMPY_AddBreakCriticalEdgesPass(self)
- def add_dead_instruction_elimination_pass(self):
- """See https://llvm.org/docs/Passes.html#die-dead-instruction-elimination""" # noqa E501
- ffi.lib.LLVMPY_AddDeadInstructionEliminationPass(self)
-
def add_dead_store_elimination_pass(self):
"""See https://llvm.org/docs/Passes.html#dse-dead-store-elimination""" # noqa E501
ffi.lib.LLVMPY_AddDeadStoreEliminationPass(self)
@@ -491,8 +487,6 @@ def run(self, function):
ffi.lib.LLVMPY_AddAlwaysInlinerPass.argtypes = [ffi.LLVMPassManagerRef, c_bool]
ffi.lib.LLVMPY_AddArgPromotionPass.argtypes = [ffi.LLVMPassManagerRef, c_uint]
ffi.lib.LLVMPY_AddBreakCriticalEdgesPass.argtypes = [ffi.LLVMPassManagerRef]
-ffi.lib.LLVMPY_AddDeadInstructionEliminationPass.argtypes = [
- ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddDeadStoreEliminationPass.argtypes = [
ffi.LLVMPassManagerRef]
ffi.lib.LLVMPY_AddReversePostOrderFunctionAttrsPass.argtypes = [
diff --git a/llvmlite/tests/test_binding.py b/llvmlite/tests/test_binding.py
index 501b46c17..35fd8968c 100644
--- a/llvmlite/tests/test_binding.py
+++ b/llvmlite/tests/test_binding.py
@@ -510,7 +510,7 @@ def test_set_option(self):
def test_version(self):
major, minor, patch = llvm.llvm_version_info
# one of these can be valid
- valid = [(11,)]
+ valid = [(11,), (12, ), (13, )]
self.assertIn((major,), valid)
self.assertIn(patch, range(10))
@@ -1414,7 +1414,6 @@ def test_populate(self):
pm.add_always_inliner_pass()
pm.add_arg_promotion_pass(42)
pm.add_break_critical_edges_pass()
- pm.add_dead_instruction_elimination_pass()
pm.add_dead_store_elimination_pass()
pm.add_post_order_function_attrs_pass()
pm.add_aggressive_instruction_combining_pass()
From 1355013f4b8bd6fb11b5e35ea800c55a3cba268b Mon Sep 17 00:00:00 2001
From: Andre Masella <andre@masella.name>
Date: Mon, 11 Apr 2022 09:48:38 -0400
Subject: [PATCH 6/6] Move formatter into common pipeline and document usage
Add the clang-formatting command to the existing Azure pipeline and update the
documentation to explain that `clang-format` should be run.
---
azure-pipelines.yml | 11 +--
buildscripts/azure/azure-linux-macos.yml | 6 ++
conda-recipes/llvm13-lto-static.patch | 4 +-
.../llvm14-remove-use-of-clonefile.patch | 29 +++++++
conda-recipes/llvmdev/bld.bat | 14 +---
conda-recipes/llvmdev/build.sh | 20 ++---
conda-recipes/llvmdev/meta.yaml | 19 ++---
conda-recipes/llvmdev/numba-3016.ll | 80 -------------------
docs/source/contributing.rst | 2 +-
ffi/build.py | 4 +-
ffi/targets.cpp | 4 +
llvmlite/tests/test_binding.py | 2 +-
12 files changed, 59 insertions(+), 136 deletions(-)
create mode 100644 conda-recipes/llvm14-remove-use-of-clonefile.patch
delete mode 100644 conda-recipes/llvmdev/numba-3016.ll
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index ad481334d..e208351df 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -38,6 +38,7 @@ jobs:
PYTHON: '3.10'
CONDA_ENV: cienv
RUN_FLAKE8: yes
+ RUN_CLANG_FORMAT: yes
# temporarily disabled
# pypy:
# PYTHON: pypy
@@ -68,13 +69,3 @@ jobs:
parameters:
name: Windows
vmImage: windows-2019
-
-- job: check_formatting
- pool:
- vmImage: 'ubuntu-latest'
- steps:
- - script: |
- set -e
- sudo apt install -y clang-format
- clang-format -n -Werror ffi/*.cpp ffi/*.h
- displayName: Check C++ formatting
diff --git a/buildscripts/azure/azure-linux-macos.yml b/buildscripts/azure/azure-linux-macos.yml
index 65e195475..377e6f9fe 100644
--- a/buildscripts/azure/azure-linux-macos.yml
+++ b/buildscripts/azure/azure-linux-macos.yml
@@ -38,6 +38,12 @@ jobs:
flake8 llvmlite
displayName: 'Flake8'
condition: eq(variables['RUN_FLAKE8'], 'yes')
+ - script: |
+ set -e
+ conda install -y clang-tools
+ clang-format -n -Werror ffi/*.cpp ffi/*.h
+ displayName: Check C++ formatting
+ condition: eq(variables['RUN_CLANG_FORMAT'], 'yes')
- script: |
set -e
diff --git a/conda-recipes/llvm13-lto-static.patch b/conda-recipes/llvm13-lto-static.patch
index b8a624250..8e63d2b80 100644
--- a/conda-recipes/llvm13-lto-static.patch
+++ b/conda-recipes/llvm13-lto-static.patch
@@ -1,5 +1,5 @@
-diff -ur llvm-13.0.0.src-orig/tools/lto/CMakeLists.txt llvm-13.0.0.src/tools/lto/CMakeLists.txt
---- llvm-13.0.0.src-orig/tools/lto/CMakeLists.txt 2021-09-24 12:18:10.000000000 -0400
+diff -ur llvm-13.0.0.src-orig/llvm/tools/lto/CMakeLists.txt llvm-13.0.0.src/tools/lto/CMakeLists.txt
+--- llvm-13.0.0.src-orig/llvm/tools/lto/CMakeLists.txt 2021-09-24 12:18:10.000000000 -0400
+++ llvm-13.0.0.src/tools/lto/CMakeLists.txt 2022-03-31 17:07:07.000000000 -0400
@@ -25,7 +25,7 @@
set(LTO_LIBRARY_TYPE MODULE)
diff --git a/conda-recipes/llvm14-remove-use-of-clonefile.patch b/conda-recipes/llvm14-remove-use-of-clonefile.patch
new file mode 100644
index 000000000..ee9c9e09f
--- /dev/null
+++ b/conda-recipes/llvm14-remove-use-of-clonefile.patch
@@ -0,0 +1,29 @@
+--- a/llvm/lib/Support/Unix/Path.inc 2022-01-08 15:15:44.000000000 +0000
++++ b/llvm/lib/Support/Unix/Path.inc 2022-01-08 15:16:07.000000000 +0000
+@@ -1458,6 +1458,7 @@
+ std::error_code copy_file(const Twine &From, const Twine &To) {
+ std::string FromS = From.str();
+ std::string ToS = To.str();
++ /*
+ #if __has_builtin(__builtin_available)
+ if (__builtin_available(macos 10.12, *)) {
+ // Optimistically try to use clonefile() and handle errors, rather than
+@@ -1486,6 +1487,7 @@
+ // cheaper.
+ }
+ #endif
++ */
+ if (!copyfile(FromS.c_str(), ToS.c_str(), /*State=*/NULL, COPYFILE_DATA))
+ return std::error_code();
+ return std::error_code(errno, std::generic_category());
+--- a/llvm/unittests/Support/Path.cpp 2022-04-25 16:53:43.000000000 -0400
++++ b/llvm/unittests/Support/Path.cpp 2022-04-25 16:54:32.000000000 -0400
+@@ -2275,7 +2275,7 @@
+ // AIX and Solaris without root will mask off (i.e., lose) the sticky bit
+ // on files.
+ #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && \
+- !defined(_AIX) && !(defined(__sun__) && defined(__svr4__))
++ !defined(_AIX) && !(defined(__sun__) && defined(__svr4__)) && !defined(__APPLE__)
+ EXPECT_EQ(fs::setPermissions(TempPath, fs::sticky_bit), NoError);
+ EXPECT_TRUE(CheckPermissions(fs::sticky_bit));
+
diff --git a/conda-recipes/llvmdev/bld.bat b/conda-recipes/llvmdev/bld.bat
index 1ce228c80..264bd63d1 100644
--- a/conda-recipes/llvmdev/bld.bat
+++ b/conda-recipes/llvmdev/bld.bat
@@ -48,7 +48,7 @@ set "CMAKE_GENERATOR_TOOLSET[2]=v141"
REM Reduce build times and package size by removing unused stuff
REM BENCHMARKS (new for llvm8) don't build under Visual Studio 14 2015
set CMAKE_CUSTOM=-DLLVM_TARGETS_TO_BUILD="%LLVM_TARGETS_TO_BUILD%" ^
- -DLLVM_INCLUDE_TESTS=OFF ^
+ -DLLVM_ENABLE_PROJECTS:STRING=lld ^
-DLLVM_INCLUDE_UTILS=ON ^
-DLLVM_INCLUDE_DOCS=OFF ^
-DLLVM_INCLUDE_EXAMPLES=OFF ^
@@ -67,7 +67,7 @@ for /l %%n in (0,1,%MAX_INDEX_CMAKE_GENERATOR%) do (
-DCMAKE_BUILD_TYPE="%BUILD_CONFIG%" ^
-DCMAKE_PREFIX_PATH="%LIBRARY_PREFIX%" ^
-DCMAKE_INSTALL_PREFIX:PATH="%LIBRARY_PREFIX%" ^
- %CMAKE_CUSTOM% "%SRC_DIR%"
+ %CMAKE_CUSTOM% "%SRC_DIR%\llvm"
if not errorlevel 1 goto configuration_successful
del CMakeCache.txt
)
@@ -85,13 +85,3 @@ if errorlevel 1 exit 1
REM === Install step ===
cmake --build . --config "%BUILD_CONFIG%" --target install
if errorlevel 1 exit 1
-
-REM From: https://github.com/conda-forge/llvmdev-feedstock/pull/53
-"%BUILD_CONFIG%\bin\opt" -S -vector-library=SVML -mcpu=haswell -O3 "%RECIPE_DIR%\numba-3016.ll" | "%BUILD_CONFIG%\bin\FileCheck" "%RECIPE_DIR%\numba-3016.ll"
-if errorlevel 1 exit 1
-
-REM This is technically how to run the suite, but it will only run in an
-REM enhanced unix-like shell which has functions like `grep` available.
-REM cd ..\test
-REM "%PYTHON%" "..\build\%BUILD_CONFIG%\bin\llvm-lit.py" -vv Transforms ExecutionEngine Analysis CodeGen/X86
-REM if errorlevel 1 exit 1
diff --git a/conda-recipes/llvmdev/build.sh b/conda-recipes/llvmdev/build.sh
index d187f6482..bdaf29769 100644
--- a/conda-recipes/llvmdev/build.sh
+++ b/conda-recipes/llvmdev/build.sh
@@ -19,6 +19,7 @@ fi
declare -a _cmake_config
_cmake_config+=(-DCMAKE_INSTALL_PREFIX:PATH=${PREFIX})
_cmake_config+=(-DCMAKE_BUILD_TYPE:STRING=Release)
+_cmake_config+=(-DLLVM_ENABLE_PROJECTS:STRING="lld")
# The bootstrap clang I use was built with a static libLLVMObject.a and I trying to get the same here
# _cmake_config+=(-DBUILD_SHARED_LIBS:BOOL=ON)
_cmake_config+=(-DLLVM_ENABLE_ASSERTIONS:BOOL=ON)
@@ -27,6 +28,7 @@ _cmake_config+=(-DLINK_POLLY_INTO_TOOLS:BOOL=ON)
_cmake_config+=(-DLLVM_ENABLE_LIBXML2:BOOL=OFF)
# Urgh, llvm *really* wants to link to ncurses / terminfo and we *really* do not want it to.
_cmake_config+=(-DHAVE_TERMINFO_CURSES=OFF)
+_cmake_config+=(-DLLVM_ENABLE_TERMINFO=OFF)
# Sometimes these are reported as unused. Whatever.
_cmake_config+=(-DHAVE_TERMINFO_NCURSES=OFF)
_cmake_config+=(-DHAVE_TERMINFO_NCURSESW=OFF)
@@ -43,7 +45,6 @@ _cmake_config+=(-DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF) # doesn't build without the
# TODO :: It would be nice if we had a cross-ecosystem 'BUILD_TIME_LIMITED' env var we could use to
# disable these unnecessary but useful things.
if [[ ${CONDA_FORGE} == yes ]]; then
- _cmake_config+=(-DLLVM_INCLUDE_TESTS=OFF)
_cmake_config+=(-DLLVM_INCLUDE_DOCS=OFF)
_cmake_config+=(-DLLVM_INCLUDE_EXAMPLES=OFF)
fi
@@ -77,7 +78,7 @@ cd build
cmake -G'Unix Makefiles' \
"${_cmake_config[@]}" \
- ..
+ ../llvm
ARCH=`uname -m`
if [ $ARCH == 'armv7l' ]; then # RPi need thread count throttling
@@ -86,18 +87,7 @@ else
make -j${CPU_COUNT} VERBOSE=1
fi
+make check-llvm-unit || exit $?
+
# From: https://github.com/conda-forge/llvmdev-feedstock/pull/53
make install || exit $?
-
-# SVML tests on x86_64 arch only
-if [[ $ARCH == 'x86_64' ]]; then
- bin/opt -S -vector-library=SVML -mcpu=haswell -O3 $RECIPE_DIR/numba-3016.ll | bin/FileCheck $RECIPE_DIR/numba-3016.ll || exit $?
-fi
-
-# run the tests, skip some on linux-32
-cd ../test
-if [[ $ARCH == 'i686' ]]; then
- ../build/bin/llvm-lit -vv Transforms Analysis CodeGen/X86
-else
- ../build/bin/llvm-lit -vv Transforms ExecutionEngine Analysis CodeGen/X86
-fi
diff --git a/conda-recipes/llvmdev/meta.yaml b/conda-recipes/llvmdev/meta.yaml
index 9c9376bb0..3ffb8ac77 100644
--- a/conda-recipes/llvmdev/meta.yaml
+++ b/conda-recipes/llvmdev/meta.yaml
@@ -1,7 +1,6 @@
-{% set shortversion = "13.0" %}
-{% set version = "13.0.1" %}
-{% set sha256_llvm = "ec6b80d82c384acad2dc192903a6cf2cdbaffb889b84bfb98da9d71e630fc834" %}
-{% set sha256_lld = "666af745e8bf7b680533b4d18b7a31dc7cab575b1e6e4d261922bbafd9644cfb" %}
+{% set shortversion = "14.0" %}
+{% set version = "14.0.1" %}
+{% set sha256_llvm = "1a3c2e57916c5a70153aaf0a0e6f1230d6368b9e0f4d04dcb9e039a31b1cd4e6" %}
{% set build_number = "5" %}
package:
@@ -9,16 +8,12 @@ package:
version: {{ version }}
source:
- - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/llvm-{{ version }}.src.tar.xz
+ - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/llvm-project-{{ version }}.src.tar.xz
fn: llvm-{{ version }}.src.tar.xz
sha256: {{ sha256_llvm }}
patches:
- ../llvm13-lto-static.patch
-
- - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/lld-{{ version }}.src.tar.xz
- fn: lld-{{ version }}.src.tar.xz
- sha256: {{ sha256_lld }}
- folder: tools/lld
+ - ../llvm14-remove-use-of-clonefile.patch
build:
number: {{ build_number }}
@@ -51,8 +46,6 @@ requirements:
- python # [not (armv6l or armv7l or aarch64 or win)]
test:
- files:
- - numba-3016.ll
commands:
- $PREFIX/bin/llvm-config --libs # [not win]
- $PREFIX/bin/llc -version # [not win]
@@ -73,5 +66,5 @@ about:
home: http://llvm.org/
dev_url: https://github.com/llvm-mirror/llvm
license: NCSA
- license_file: LICENSE.TXT
+ license_file: llvm/LICENSE.TXT
summary: Development headers and libraries for LLVM
diff --git a/conda-recipes/llvmdev/numba-3016.ll b/conda-recipes/llvmdev/numba-3016.ll
deleted file mode 100644
index 1a9b3ecf8..000000000
--- a/conda-recipes/llvmdev/numba-3016.ll
+++ /dev/null
@@ -1,80 +0,0 @@
-; Regression test for llvmdev-feedstock#52 and numba#3016
-
-; Generated from C code: int a[1<<10],b[1<<10]; void foo() { int i=0; for(i=0; i<1<<10; i++) { b[i]=sin(a[i]); }}
-; compiled: -fvectorize -fveclib=SVML -O -S -mavx -mllvm -disable-llvm-optzns -emit-llvm
-
-; RUN: opt -vector-library=SVML -mcpu=haswell -O3 -S < %s | FileCheck %s
-; CHECK: call {{.*}}__svml_sin4_ha(
-; CHECK-NOT: call {{.*}}__svml_sin4(
-; CHECK-NOT: call {{.*}}__svml_sin8
-
-source_filename = "svml-3016.c"
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-pc-linux-gnu"
-
-@a = common dso_local global [1024 x i32] zeroinitializer, align 16
-@b = common dso_local global [1024 x i32] zeroinitializer, align 16
-
-; Function Attrs: nounwind uwtable
-define dso_local void @foo() #0 {
- %1 = alloca i32, align 4
- %2 = bitcast i32* %1 to i8*
- call void @llvm.lifetime.start.p0i8(i64 4, i8* %2) #3
- store i32 0, i32* %1, align 4, !tbaa !2
- store i32 0, i32* %1, align 4, !tbaa !2
- br label %3
-
-; <label>:3: ; preds = %17, %0
- %4 = load i32, i32* %1, align 4, !tbaa !2
- %5 = icmp slt i32 %4, 1024
- br i1 %5, label %6, label %20
-
-; <label>:6: ; preds = %3
- %7 = load i32, i32* %1, align 4, !tbaa !2
- %8 = sext i32 %7 to i64
- %9 = getelementptr inbounds [1024 x i32], [1024 x i32]* @a, i64 0, i64 %8
- %10 = load i32, i32* %9, align 4, !tbaa !2
- %11 = sitofp i32 %10 to double
- %12 = call double @"llvm.sin.f64"(double %11) #3
- %13 = fptosi double %12 to i32
- %14 = load i32, i32* %1, align 4, !tbaa !2
- %15 = sext i32 %14 to i64
- %16 = getelementptr inbounds [1024 x i32], [1024 x i32]* @b, i64 0, i64 %15
- store i32 %13, i32* %16, align 4, !tbaa !2
- br label %17
-
-; <label>:17: ; preds = %6
- %18 = load i32, i32* %1, align 4, !tbaa !2
- %19 = add nsw i32 %18, 1
- store i32 %19, i32* %1, align 4, !tbaa !2
- br label %3
-
-; <label>:20: ; preds = %3
- %21 = bitcast i32* %1 to i8*
- call void @llvm.lifetime.end.p0i8(i64 4, i8* %21) #3
- ret void
-}
-
-; Function Attrs: argmemonly nounwind
-declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
-
-; Function Attrs: nounwind
-declare dso_local double @"llvm.sin.f64"(double) #2
-
-; Function Attrs: argmemonly nounwind
-declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
-
-attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+avx,+fxsr,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave" "unsafe-fp-math"="false" "use-soft-float"="false" }
-attributes #1 = { argmemonly nounwind }
-attributes #2 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+avx,+fxsr,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave" "unsafe-fp-math"="false" "use-soft-float"="false" }
-attributes #3 = { nounwind }
-
-!llvm.module.flags = !{!0}
-!llvm.ident = !{!1}
-
-!0 = !{i32 1, !"wchar_size", i32 4}
-!1 = !{!"clang version 7.0.0- (trunk)"}
-!2 = !{!3, !3, i64 0}
-!3 = !{!"int", !4, i64 0}
-!4 = !{!"omnipotent char", !5, i64 0}
-!5 = !{!"Simple C/C++ TBAA"}
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
index 6aa0af603..54b553f4a 100644
--- a/docs/source/contributing.rst
+++ b/docs/source/contributing.rst
@@ -72,7 +72,7 @@ Coding conventions
------------------
* All Python code should follow `PEP 8 <https://www.python.org/dev/peps/pep-0008/>`_.
-* Our C++ code does not have a well-defined coding style.
+* Our C++ code is formatted with clang-format from the latest Conda clang-tools package
* Code and documentation should generally fit within 80 columns,
for maximum readability with all existing tools, such as code
review user interfaces.
diff --git a/ffi/build.py b/ffi/build.py
index e830342eb..cb4ac0281 100755
--- a/ffi/build.py
+++ b/ffi/build.py
@@ -165,8 +165,8 @@ def main_posix(kind, library_ext):
else:
(version, _) = out.split('.', 1)
version = int(version)
- if version < 11 or version > 13:
- msg = ("Building llvmlite requires LLVM 11, 12, or 13, got "
+ if version < 11 or version > 14:
+ msg = ("Building llvmlite requires LLVM 11, 12, 13, or 14, got "
"{!r}. Be sure to set LLVM_CONFIG to the right executable "
"path.\nRead the documentation at "
"http://llvmlite.pydata.org/ for more information about "
diff --git a/ffi/targets.cpp b/ffi/targets.cpp
index 42fe46f2c..c902c927e 100644
--- a/ffi/targets.cpp
+++ b/ffi/targets.cpp
@@ -6,7 +6,11 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/ADT/Triple.h"
+#if LLVM_VERSION_MAJOR > 13
+#include "llvm/MC/TargetRegistry.h"
+#else
#include "llvm/Support/TargetRegistry.h"
+#endif
#include "llvm/IR/Type.h"
#include <cstdio>
diff --git a/llvmlite/tests/test_binding.py b/llvmlite/tests/test_binding.py
index 35fd8968c..8d98aa175 100644
--- a/llvmlite/tests/test_binding.py
+++ b/llvmlite/tests/test_binding.py
@@ -510,7 +510,7 @@ def test_set_option(self):
def test_version(self):
major, minor, patch = llvm.llvm_version_info
# one of these can be valid
- valid = [(11,), (12, ), (13, )]
+ valid = [(11,), (12, ), (13, ), (14, )]
self.assertIn((major,), valid)
self.assertIn(patch, range(10))