summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxime Arthaud2016-05-26 23:46:23 -0700
committerMaxime Arthaud2016-05-26 23:46:23 -0700
commit64c7698253754e89f2f12eb154200483888d4c91 (patch)
treec8d39065d78422c1f97a7382045b9a5375c213b3
downloadaur-64c7698253754e89f2f12eb154200483888d4c91.tar.gz
Initial commit
-rw-r--r--.SRCINFO25
-rw-r--r--PKGBUILD52
-rw-r--r--llvm-3.8.patch183
3 files changed, 260 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..ff7319c003ca
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,25 @@
+pkgbase = ikos
+ pkgdesc = A static analysis tool for C/C++ developed by NASA
+ pkgver = 1.0.0
+ pkgrel = 1
+ url = https://ti.arc.nasa.gov/opensource/ikos/
+ arch = any
+ license = custom:NOSA 1.3
+ makedepends = cmake
+ makedepends = boost
+ depends = gmp
+ depends = boost-libs
+ depends = python
+ depends = sqlite
+ depends = llvm
+ depends = llvm-libs
+ depends = clang
+ source = https://ti.arc.nasa.gov/m/opensource/downloads/ikos/ikos-1.0.0.tar.gz
+ source = https://ti.arc.nasa.gov/m/opensource/downloads/ikos/IKOS_NASA_Open_Source_Agreement.pdf
+ source = llvm-3.8.patch
+ sha512sums = d8b71d401d002ee22d39b4c68ecd97ba098d334fa966cf6b0d4f3328bdd85fa60b68d3c66543f154933dbb4dd53247422243cdb12418338d85a6ef8bb35b9051
+ sha512sums = 3caeffbe06254b3a181eee1f172bde48d7c8007e989b07928b0ce4e737759d5e2649d25419722c3b7a78ca8ddf408ce150a143490489641527cbcac479c241b7
+ sha512sums = 2b0862679081be24772d2172fc1145833edf124f4ec54839925022428bb7db91e28e30be9fe8ccd0884f60526188db5ce1e621748e68b7e69e7423856a527596
+
+pkgname = ikos
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..9f6d8c8a793b
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,52 @@
+# Maintainer: Maxime Arthaud <maxime@arthaud.me>
+
+pkgname=ikos
+pkgver=1.0.0
+pkgrel=1
+pkgdesc='A static analysis tool for C/C++ developed by NASA'
+arch=('any')
+url='https://ti.arc.nasa.gov/opensource/ikos/'
+license=('custom:NOSA 1.3')
+depends=('gmp' 'boost-libs' 'python' 'sqlite' 'llvm' 'llvm-libs' 'clang')
+makedepends=('cmake' 'boost')
+source=('https://ti.arc.nasa.gov/m/opensource/downloads/ikos/ikos-1.0.0.tar.gz'
+ 'https://ti.arc.nasa.gov/m/opensource/downloads/ikos/IKOS_NASA_Open_Source_Agreement.pdf'
+ 'llvm-3.8.patch')
+sha512sums=('d8b71d401d002ee22d39b4c68ecd97ba098d334fa966cf6b0d4f3328bdd85fa60b68d3c66543f154933dbb4dd53247422243cdb12418338d85a6ef8bb35b9051'
+ '3caeffbe06254b3a181eee1f172bde48d7c8007e989b07928b0ce4e737759d5e2649d25419722c3b7a78ca8ddf408ce150a143490489641527cbcac479c241b7'
+ '2b0862679081be24772d2172fc1145833edf124f4ec54839925022428bb7db91e28e30be9fe8ccd0884f60526188db5ce1e621748e68b7e69e7423856a527596')
+
+prepare() {
+ cd "$srcdir/ikos-1.0.0"
+
+ # Fix for llvm 3.8
+ patch -p0 < ../llvm-3.8.patch
+
+ mkdir build
+}
+
+build() {
+ cd "$srcdir/ikos-1.0.0/build"
+
+ cmake \
+ -G "Unix Makefiles" \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX="$pkgdir/opt/ikos" \
+ ..
+
+ make
+}
+
+package() {
+ cd "$srcdir/ikos-1.0.0/build"
+
+ make install
+
+ mkdir -p "$pkgdir/usr/bin"
+ echo '#!/bin/bash
+export IKOS_INSTALL=/opt/ikos
+exec $IKOS_INSTALL/bin/ikos "$@"' > "$pkgdir/usr/bin/ikos"
+ chmod 655 "$pkgdir/usr/bin/ikos"
+
+ install -Dm644 "$srcdir/IKOS_NASA_Open_Source_Agreement.pdf" "$pkgdir/usr/share/licenses/ikos/LICENSE"
+}
diff --git a/llvm-3.8.patch b/llvm-3.8.patch
new file mode 100644
index 000000000000..43a05941a237
--- /dev/null
+++ b/llvm-3.8.patch
@@ -0,0 +1,183 @@
+Index: frontends/llvm/CMakeLists.txt
+===================================================================
+--- frontends/llvm/CMakeLists.txt (révision 1079)
++++ frontends/llvm/CMakeLists.txt (copie de travail)
+@@ -123,8 +123,8 @@
+ find_package(LLVM REQUIRED)
+ message(STATUS "Found LLVM ${LLVM_VERSION}")
+
+-if (NOT LLVM_VERSION EQUAL 3.7)
+- message(FATAL_ERROR "llvm 3.7 required.")
++if (LLVM_VERSION VERSION_LESS "3.7")
++ message(FATAL_ERROR "llvm 3.7 or higher required.")
+ endif()
+
+ set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin")
+@@ -191,7 +191,6 @@
+ core
+ instcombine
+ instrumentation
+- ipa
+ ipo
+ irreader
+ mc
+@@ -204,4 +203,10 @@
+ )
+ target_link_libraries(ikos-pp ${IKOS_PP_LLVM_LIBS})
+
++if (LLVM_VERSION VERSION_LESS "3.8")
++ # IPA is only available on llvm 3.7 and below
++ llvm_map_components_to_libnames(IKOS_PP_IPA ipa)
++ target_link_libraries(ikos-pp ${IKOS_PP_IPA})
++endif()
++
+ install(TARGETS ikos-pp RUNTIME DESTINATION bin OPTIONAL)
+Index: frontends/llvm/src/ikos-pp/ikos_pp.cpp
+===================================================================
+--- frontends/llvm/src/ikos-pp/ikos_pp.cpp (révision 1079)
++++ frontends/llvm/src/ikos-pp/ikos_pp.cpp (copie de travail)
+@@ -182,10 +182,13 @@
+
+ llvm::legacy::PassManager pass_manager;
+ llvm::PassRegistry& Registry = *llvm::PassRegistry::getPassRegistry();
++
+ llvm::initializeAnalysis(Registry);
+
++#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR == 7)
+ /// call graph and other IPA passes
+ llvm::initializeIPA(Registry);
++#endif
+
+ if (PPLevel == simple) {
+ // -- SSA
+@@ -251,7 +254,11 @@
+ // loop-closed SSA
+ pass_manager.add(llvm::createLCSSAPass());
+ // trivial invariants outside loops
++#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR == 7)
+ pass_manager.add(llvm::createBasicAliasAnalysisPass());
++#else
++ pass_manager.add(llvm::createBasicAAWrapperPass());
++#endif
+ pass_manager.add(llvm::createLICMPass()); // LICM needs alias analysis
+ pass_manager.add(llvm::createPromoteMemoryToRegisterPass());
+ // dead loop elimination
+Index: frontends/llvm/src/passes/llvm_to_ar.cpp
+===================================================================
+--- frontends/llvm/src/passes/llvm_to_ar.cpp (révision 1079)
++++ frontends/llvm/src/passes/llvm_to_ar.cpp (copie de travail)
+@@ -457,7 +457,7 @@
+ UnifyFunctionExitNodes& ufen = getAnalysis< UnifyFunctionExitNodes >(*f);
+
+ _functions.push_back(boost::shared_ptr< ARFunction >(
+- new ARFunction(f,
++ new ARFunction(&*f,
+ ufen.getReturnBlock(),
+ ufen.getUnreachableBlock(),
+ ufen.getUnwindBlock())));
+@@ -532,7 +532,7 @@
+ for (Module::global_iterator global = m.global_begin();
+ global != m.global_end();
+ global++) {
+- _global_vars[global] = boost::shared_ptr< ARGlobalVar >(
++ _global_vars[&*global] = boost::shared_ptr< ARGlobalVar >(
+ new ARGlobalVar(UIDGenerator::nextUID()));
+ }
+
+@@ -1286,7 +1286,8 @@
+ case Instruction::FCmp:
+ case Instruction::ICmp: {
+ CmpInst* cmp = CmpInst::Create((Instruction::OtherOps)e->getOpcode(),
+- e->getPredicate(),
++ static_cast< CmpInst::Predicate >(
++ e->getPredicate()),
+ e->getOperand(0),
+ e->getOperand(1));
+ cfg.split_blocks(cmp, cmp);
+Index: frontends/llvm/src/passes/lower_cst_expr.cpp
+===================================================================
+--- frontends/llvm/src/passes/lower_cst_expr.cpp (révision 1079)
++++ frontends/llvm/src/passes/lower_cst_expr.cpp (copie de travail)
+@@ -180,7 +180,8 @@
+ Instruction::OtherOps OtherOp =
+ (Instruction::OtherOps)(CstExp->getOpcode());
+ NewInst = CmpInst::Create(OtherOp,
+- CstExp->getPredicate(),
++ static_cast< CmpInst::Predicate >(
++ CstExp->getPredicate()),
+ CstExp->getOperand(0),
+ CstExp->getOperand(1),
+ CstExp->getName(),
+Index: frontends/llvm/src/passes/mark_no_return_functions.cpp
+===================================================================
+--- frontends/llvm/src/passes/mark_no_return_functions.cpp (révision 1079)
++++ frontends/llvm/src/passes/mark_no_return_functions.cpp (copie de travail)
+@@ -73,7 +73,7 @@
+ continue;
+
+ bool mayHaveSideEffects = false;
+- for (inst_iterator It = inst_begin(F), Et = inst_end(F); It != Et; ++It)
++ for (inst_iterator It = inst_begin(&*F), Et = inst_end(&*F); It != Et; ++It)
+ mayHaveSideEffects |= It->mayHaveSideEffects();
+
+ if (mayHaveSideEffects)
+Index: frontends/llvm/src/utils/local.cpp
+===================================================================
+--- frontends/llvm/src/utils/local.cpp (révision 1079)
++++ frontends/llvm/src/utils/local.cpp (copie de travail)
+@@ -37,7 +37,13 @@
+ new UnreachableInst(I->getContext(), I);
+
+ // All instructions after this are dead.
+- BasicBlock::iterator BBI = I, BBE = BB->end();
++#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR == 7)
++ BasicBlock::iterator BBI = I;
++#else
++ BasicBlock::iterator BBI = I->getIterator();
++#endif
++ BasicBlock::iterator BBE = BB->end();
++
+ while (BBI != BBE) {
+ if (!BBI->use_empty())
+ BBI->replaceAllUsesWith(UndefValue::get(BBI->getType()));
+@@ -85,7 +91,7 @@
+ ++BBI;
+ if (!isa< UnreachableInst >(BBI)) {
+ // Don't insert a call to llvm.trap right before the unreachable.
+- ikos_pp::changeToUnreachable(BBI, false);
++ ikos_pp::changeToUnreachable(&*BBI, false);
+ Changed = true;
+ }
+ break;
+@@ -142,7 +148,7 @@
+ /// change was made, false otherwise.
+ bool ikos_pp::removeUnreachableBlocks(Function& F) {
+ SmallPtrSet< BasicBlock*, 128 > Reachable;
+- bool Changed = markAliveBlocks(F.begin(), Reachable);
++ bool Changed = markAliveBlocks(&*F.begin(), Reachable);
+
+ // If there are unreachable blocks in the CFG...
+ if (Reachable.size() == F.size())
+@@ -154,17 +160,18 @@
+ // Loop over all of the basic blocks that are not reachable, dropping all of
+ // their internal references...
+ for (Function::iterator BB = ++F.begin(), E = F.end(); BB != E; ++BB) {
+- if (Reachable.count(BB))
++ if (Reachable.count(&*BB))
+ continue;
+
+- for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI)
++ for (succ_iterator SI = succ_begin(&*BB), SE = succ_end(&*BB); SI != SE;
++ ++SI)
+ if (Reachable.count(*SI))
+- (*SI)->removePredecessor(BB);
++ (*SI)->removePredecessor(&*BB);
+ BB->dropAllReferences();
+ }
+
+ for (Function::iterator I = ++F.begin(); I != F.end();)
+- if (!Reachable.count(I))
++ if (!Reachable.count(&*I))
+ I = F.getBasicBlockList().erase(I);
+ else
+ ++I;