diff options
author | Maxime Arthaud | 2016-05-26 23:46:23 -0700 |
---|---|---|
committer | Maxime Arthaud | 2016-05-26 23:46:23 -0700 |
commit | 64c7698253754e89f2f12eb154200483888d4c91 (patch) | |
tree | c8d39065d78422c1f97a7382045b9a5375c213b3 | |
download | aur-64c7698253754e89f2f12eb154200483888d4c91.tar.gz |
Initial commit
-rw-r--r-- | .SRCINFO | 25 | ||||
-rw-r--r-- | PKGBUILD | 52 | ||||
-rw-r--r-- | llvm-3.8.patch | 183 |
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; |