Skip to content

Commit e531af0

Browse files
committed
Resolved Merge Conflict with development branch
2 parents 6a5d3a1 + 94f0419 commit e531af0

91 files changed

Lines changed: 759 additions & 344 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,22 @@ include_directories(
9191
# Threads
9292
find_package(Threads)
9393

94+
# Fix boost_thread dependency for MacOS
95+
if(APPLE)
96+
set(BOOST_THREAD thread-mt)
97+
else()
98+
set(BOOST_THREAD thread)
99+
endif()
100+
101+
# Boost
102+
find_package(Boost 1.65.1 COMPONENTS filesystem graph system program_options log ${BOOST_THREAD} REQUIRED)
103+
include_directories(${Boost_INCLUDE_DIRS})
104+
add_definitions(-DBOOST_LOG_DYN_LINK)
105+
94106
# JSON library
95107
option(JSON_BuildTests OFF)
96108
add_subdirectory(external/json EXCLUDE_FROM_ALL)
97-
include_directories(external/json/single_include/nlohmann)
109+
include_directories(external/json/single_include/)
98110

99111
# Googletest
100112
if (NOT PHASAR_IN_TREE)
@@ -111,11 +123,6 @@ endif()
111123
add_subdirectory(external/WALi-OpenNWA)
112124
include_directories(external/WALi-OpenNWA/Source/wali/include)
113125

114-
# Boost
115-
find_package(Boost COMPONENTS filesystem graph system program_options log thread REQUIRED)
116-
include_directories(${BOOST_INCLUDE_DIR})
117-
add_definitions(-DBOOST_LOG_DYN_LINK)
118-
119126
# SQL
120127
find_path(SQLITE3_INCLUDE_DIR NAMES sqlite3.h)
121128
find_library(SQLITE3_LIBRARY NAMES sqlite3)
@@ -203,13 +210,6 @@ llvm_map_components_to_libnames(llvm_libs
203210
# phasar-based binaries
204211
add_subdirectory(tools)
205212

206-
# Fix boost_thread dependency for MacOS
207-
if(APPLE)
208-
set(BOOST_THREAD boost_thread-mt)
209-
else()
210-
set(BOOST_THREAD boost_thread)
211-
endif()
212-
213213
# Workaround: Remove Plugins for MacOS for now
214214
if(APPLE)
215215
set(PHASAR_PLUGINS_LIB)
@@ -243,7 +243,7 @@ install(DIRECTORY include/
243243
)
244244

245245
# Install the header only json container
246-
install(DIRECTORY external/json/single_include/nlohmann/
246+
install(DIRECTORY external/json/single_include/
247247
DESTINATION include
248248
FILES_MATCHING PATTERN "*.hpp"
249249
)

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ COPY . /usr/src/phasar
1212

1313
RUN ./bootstrap_docker.sh
1414

15-
ENTRYPOINT [ "./build/phasar" ]
15+
ENTRYPOINT [ "./build/phasar-llvm/phasar-llvm" ]

bootstrap.sh

Lines changed: 82 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
#!/bin/bash
22
set -e
33

4+
readonly PHASAR_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
5+
readonly PHASAR_INSTALL_DIR="/usr/local/phasar"
6+
readonly LLVM_INSTALL_DIR="/usr/local/llvm-9"
7+
48
NUM_THREADS=$(nproc)
59
LLVM_RELEASE=llvmorg-9.0.0
10+
DO_UNIT_TEST=false
11+
612

713
# Parsing command-line-parameters
814
# See "https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash" as a reference
@@ -18,6 +24,19 @@ case $key in
1824
shift # past argument
1925
shift # past value
2026
;;
27+
-u|--unittest)
28+
DO_UNIT_TEST=true
29+
shift # past argument
30+
;;
31+
-DBOOST_DIR)
32+
DESIRED_BOOST_DIR="$2"
33+
shift # past argument
34+
shift # past value
35+
;;
36+
-DBOOST_DIR=*)
37+
DESIRED_BOOST_DIR="${key#*=}"
38+
shift # past argument=value
39+
;;
2140
-DBOOST_VERSION)
2241
DESIRED_BOOST_VERSION="$2"
2342
shift # past argument
@@ -41,79 +60,87 @@ set -- "${POSITIONAL[@]}" # restore positional parameters
4160
echo "installing phasar dependencies..."
4261

4362
sudo apt-get update
44-
sudo apt-get install zlib1g-dev sqlite3 libsqlite3-dev libmysqlcppconn-dev bear python3 doxygen graphviz python python-dev python3-pip python-pip libxml2 libxml2-dev libncurses5-dev libncursesw5-dev swig build-essential g++ cmake libz3-dev libedit-dev python-sphinx libomp-dev libcurl4-openssl-dev -y
63+
sudo apt-get install zlib1g-dev sqlite3 libsqlite3-dev bear python3 doxygen graphviz python python-dev python3-pip python-pip libxml2 libxml2-dev libncurses5-dev libncursesw5-dev swig build-essential g++ cmake libz3-dev libedit-dev python-sphinx libomp-dev libcurl4-openssl-dev -y
4564
sudo pip install Pygments
4665
sudo pip install pyyaml
47-
# installing boost
48-
#wget https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
49-
#tar xvf boost_1_66_0.tar.gz
50-
#cd boost_1_66_0/
51-
#./bootstrap.sh
52-
#sudo ./b2 install
53-
#cd ..
5466

67+
if [ ! -z ${DESIRED_BOOST_DIR} ]; then
68+
BOOST_PARAMS="-DBOOST_ROOT=${DESIRED_BOOST_DIR}"
69+
else
5570
# New way of installing boost:
56-
5771
# Check whether we have the required boost packages installed
58-
59-
BOOST_VERSION=$(echo -e '#include <boost/version.hpp>\nBOOST_LIB_VERSION' | gcc -s -x c++ -E - 2>/dev/null| grep "^[^#;]" | tr -d '\"')
60-
61-
if [ -z $BOOST_VERSION ] ;then
62-
if [ -z $DESIRED_BOOST_VERSION ] ;then
63-
sudo apt-get install libboost-all-dev -y
64-
else
65-
# DESIRED_BOOST_VERSION in form d.d, i.e. 1.65 (this is the latest version I found in the apt repo)
66-
sudo apt-get install "libboost${DESIRED_BOOST_VERSION}-all-dev" -y
67-
fi
68-
#verify installation
69-
BOOST_VERSION=$(echo -e '#include <boost/version.hpp>\nBOOST_LIB_VERSION' | gcc -s -x c++ -E - 2>/dev/null| grep "^[^#;]" | tr -d '\"')
70-
if [ -z $BOOST_VERSION ] ;then
71-
echo "Failed installing boost $DESIRED_BOOST_VERSION"
72-
exit 1
73-
else
74-
echo "Successfully installed boost v${BOOST_VERSION//_/.}"
75-
fi
76-
else
77-
echo "Already installed boost version ${BOOST_VERSION//_/.}"
78-
DESIRED_BOOST_VERSION=${BOOST_VERSION//_/.}
79-
# install missing packages if necessary
80-
boostlibnames=("libboost-system" "libboost-filesystem"
81-
"libboost-graph" "libboost-program-options"
82-
"libboost-log" "libboost-thread")
83-
additional_boost_libs=()
84-
85-
for boost_lib in ${boostlibnames[@]}; do
86-
dpkg -s "$boost_lib${DESIRED_BOOST_VERSION}" >/dev/null 2>&1 || additional_boost_libs+=("$boost_lib${DESIRED_BOOST_VERSION}")
87-
done
88-
if [ ${#additional_boost_libs[@]} -gt 0 ] ;then
89-
echo "Installing additional ${#additional_boost_libs[@]} boost packages: ${additional_boost_libs[@]}"
90-
sudo apt-get install ${additional_boost_libs[@]} -y
91-
fi
72+
BOOST_VERSION=$(echo -e '#include <boost/version.hpp>\nBOOST_LIB_VERSION' | gcc -s -x c++ -E - 2>/dev/null| grep "^[^#;]" | tr -d '\"')
73+
74+
if [ -z $BOOST_VERSION ] ;then
75+
if [ -z $DESIRED_BOOST_VERSION ] ;then
76+
sudo apt-get install libboost-all-dev -y
77+
else
78+
# DESIRED_BOOST_VERSION in form d.d, i.e. 1.65 (this is the latest version I found in the apt repo)
79+
sudo apt-get install "libboost${DESIRED_BOOST_VERSION}-all-dev" -y
80+
fi
81+
#verify installation
82+
BOOST_VERSION=$(echo -e '#include <boost/version.hpp>\nBOOST_LIB_VERSION' | gcc -s -x c++ -E - 2>/dev/null| grep "^[^#;]" | tr -d '\"')
83+
if [ -z $BOOST_VERSION ] ;then
84+
echo "Failed installing boost $DESIRED_BOOST_VERSION"
85+
exit 1
86+
else
87+
echo "Successfully installed boost v${BOOST_VERSION//_/.}"
88+
fi
89+
else
90+
echo "Already installed boost version ${BOOST_VERSION//_/.}"
91+
DESIRED_BOOST_VERSION=${BOOST_VERSION//_/.}
92+
# install missing packages if necessary
93+
boostlibnames=("libboost-system" "libboost-filesystem"
94+
"libboost-graph" "libboost-program-options"
95+
"libboost-log" "libboost-thread")
96+
additional_boost_libs=()
97+
98+
for boost_lib in ${boostlibnames[@]}; do
99+
dpkg -s "$boost_lib${DESIRED_BOOST_VERSION}" >/dev/null 2>&1 || additional_boost_libs+=("$boost_lib${DESIRED_BOOST_VERSION}")
100+
done
101+
if [ ${#additional_boost_libs[@]} -gt 0 ] ;then
102+
echo "Installing additional ${#additional_boost_libs[@]} boost packages: ${additional_boost_libs[@]}"
103+
sudo apt-get install ${additional_boost_libs[@]} -y
104+
fi
105+
fi
92106
fi
93107

94108

95109

96110
# installing LLVM
97-
./utils/install-llvm.sh $NUM_THREADS . $LLVM_RELEASE
98-
# installing wllvm
111+
tmp_dir=`mktemp -d "llvm-9_build.XXXXXXXX" --tmpdir`
112+
./utils/install-llvm.sh ${NUM_THREADS} ${tmp_dir} ${LLVM_INSTALL_DIR} ${LLVM_RELEASE}
113+
rm -rf ${tmp_dir}
99114
sudo pip3 install wllvm
100115

101116
echo "dependencies successfully installed"
102-
echo "build phasar..."
117+
echo "Building PhASAR..."
118+
${DO_UNIT_TESTS} && echo "with unit tests."
103119

104-
#git submodule init
105-
#git submodule update
120+
git submodule init
121+
git submodule update
106122

107-
export CC=/usr/local/bin/clang
108-
export CXX=/usr/local/bin/clang++
123+
export CC=${LLVM_INSTALL}/bin/clang
124+
export CXX=${LLVM_INSTALL}/bin/clang++
109125

110-
mkdir -p build
111-
cd build
112-
cmake -DCMAKE_BUILD_TYPE=Release ..
126+
mkdir -p ${PHASAR_DIR}/build
127+
cd ${PHASAR_DIR}/build
128+
cmake -DCMAKE_BUILD_TYPE=Release ${BOOST_PARAMS} -DPHASAR_BUILD_UNITTESTS=${DO_UNIT_TEST} ${PHASAR_DIR}
113129
make -j $NUM_THREADS
130+
131+
if ${DO_UNIT_TEST}; then
132+
echo "Running PhASAR unit tests..."
133+
pushd unittests
134+
for x in `find . -type f -executable -print`; do
135+
pushd ${x%/*} && ./${x##*/} && popd || { echo "Test ${x} failed, aborting."; exit 1; };
136+
done
137+
popd
138+
fi
139+
114140
echo "phasar successfully built"
115141
echo "install phasar..."
116-
sudo make install
142+
sudo cmake -DCMAKE_INSTALL_PREFIX=${PHASAR_INSTALL_DIR} -P cmake_install.cmake
143+
117144
sudo ldconfig
118145
cd ..
119-
echo "phasar successfully installed"
146+
echo "phasar successfully installed to ${PHASAR_INSTALL_DIR}"

include/phasar/Controller/AnalysisConfigurations.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ ANALYSIS_CONFIGURATIONS("IFDSUninitializedVariables", "ifds-uninit", IFDSUniniti
1515
ANALYSIS_CONFIGURATIONS("IFDSConstAnalysis", "ifds-const", IFDSConstAnalysis)
1616
ANALYSIS_CONFIGURATIONS("IFDSTaintAnalysis", "ifds-taint", IFDSTaintAnalysis)
1717
ANALYSIS_CONFIGURATIONS("IDETaintAnalysis", "ide-taint", IDETaintAnalysis)
18-
ANALYSIS_CONFIGURATIONS("IDETypeStateAnalysis", "ide-ts", IDETypeStateAnalysis)
18+
ANALYSIS_CONFIGURATIONS("IDECSTDIOTypeStateAnalysis", "ide-stdio-ts", IDECSTDIOTypeStateAnalysis)
19+
ANALYSIS_CONFIGURATIONS("IDEOpenSSLTypeStateAnalysis", "ide-openssl-ts", IDEOpenSSLTypeStateAnalysis)
1920
ANALYSIS_CONFIGURATIONS("IFDSTypeAnalysis", "ifds-ts", IFDSTypeAnalysis)
2021
ANALYSIS_CONFIGURATIONS("IFDSSolverTest", "ifds-solvertest", IFDSSolverTest)
2122
ANALYSIS_CONFIGURATIONS("IFDSLinearConstantAnalysis", "ifds-lca", IFDSLinearConstantAnalysis)

include/phasar/Controller/AnalysisController.h

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,33 @@
1515
#include <string>
1616
#include <vector>
1717

18+
#include <boost/filesystem.hpp>
19+
1820
#include <phasar/DB/ProjectIRDB.h>
1921
#include <phasar/PhasarLLVM/AnalysisStrategy/Strategies.h>
2022
#include <phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h>
2123
#include <phasar/PhasarLLVM/Pointer/LLVMPointsToInfo.h>
2224
#include <phasar/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.h>
2325
#include <phasar/PhasarLLVM/Utils/DataFlowAnalysisType.h>
26+
#include <phasar/Utils/EnumFlags.h>
2427

2528
namespace psr {
2629

30+
enum class AnalysisControllerEmitterOptions : uint32_t {
31+
None = 0,
32+
EmitIR = (1 << 0),
33+
EmitRawResults = (1 << 1),
34+
EmitTextReport = (1 << 2),
35+
EmitGraphicalReport = (1 << 3),
36+
EmitESGAsDot = (1 << 4),
37+
EmitTHAsText = (1 << 5),
38+
EmitTHAsDot = (1 << 6),
39+
EmitCGAsText = (1 << 7),
40+
EmitCGAsDot = (1 << 8),
41+
EmitPTAAsText = (1 << 9),
42+
EmitPTAAsDOT = (1 << 10)
43+
};
44+
2745
class AnalysisController {
2846
private:
2947
ProjectIRDB &IRDB;
@@ -34,21 +52,67 @@ class AnalysisController {
3452
std::vector<std::string> AnalysisConfigs;
3553
std::set<std::string> EntryPoints;
3654
[[maybe_unused]] AnalysisStrategy Strategy;
55+
AnalysisControllerEmitterOptions EmitterOptions =
56+
AnalysisControllerEmitterOptions::None;
57+
std::string ProjectID;
58+
std::string OutDirectory;
59+
boost::filesystem::path ResultDirectory;
3760

3861
void executeDemandDriven();
62+
3963
void executeIncremental();
64+
4065
void executeModuleWise();
66+
4167
void executeVariational();
68+
4269
void executeWholeProgram();
4370

71+
void emitRequestedHelperAnalysisResults();
72+
73+
template <typename T> void emitRequestedDataFlowResults(T &WPA) {
74+
if (EmitterOptions & AnalysisControllerEmitterOptions::EmitTextReport) {
75+
if (!ResultDirectory.empty()) {
76+
std::ofstream OFS(ResultDirectory.string() + "/psr-report.txt");
77+
WPA.emitTextReport(OFS);
78+
} else {
79+
WPA.emitTextReport();
80+
}
81+
}
82+
if (EmitterOptions &
83+
AnalysisControllerEmitterOptions::EmitGraphicalReport) {
84+
if (!ResultDirectory.empty()) {
85+
std::ofstream OFS(ResultDirectory.string() + "/psr-report.html");
86+
WPA.emitGraphicalReport(OFS);
87+
} else {
88+
WPA.emitGraphicalReport();
89+
}
90+
}
91+
if (EmitterOptions & AnalysisControllerEmitterOptions::EmitRawResults) {
92+
if (!ResultDirectory.empty()) {
93+
std::ofstream OFS(ResultDirectory.string() + "/psr-raw-results.txt");
94+
WPA.dumpResults(OFS);
95+
} else {
96+
WPA.dumpResults();
97+
}
98+
}
99+
}
100+
44101
public:
45102
AnalysisController(ProjectIRDB &IRDB,
46103
std::vector<DataFlowAnalysisType> DataFlowAnalyses,
47104
std::vector<std::string> AnalysisConfigs,
105+
PointerAnalysisType PTATy, CallGraphAnalysisType CGTy,
48106
std::set<std::string> EntryPoints,
49-
AnalysisStrategy Strategy);
107+
AnalysisStrategy Strategy,
108+
AnalysisControllerEmitterOptions EmitterOptions,
109+
std::string ProjectID = "default-phasar-project",
110+
std::string OutDirectory = "");
111+
50112
~AnalysisController() = default;
113+
51114
AnalysisController(const AnalysisController &) = delete;
115+
52116
AnalysisController(AnalysisController &&) = delete;
53117

54118
void executeAs(AnalysisStrategy Strategy);

include/phasar/DB/ProjectIRDB.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#ifndef PHASAR_DB_PROJECTIRDB_H_
1111
#define PHASAR_DB_PROJECTIRDB_H_
1212

13-
#include <initializer_list>
13+
#include <iostream>
1414
#include <map>
1515
#include <memory>
1616
#include <set>
@@ -146,7 +146,8 @@ class ProjectIRDB {
146146

147147
void print() const;
148148

149-
void emitPreprocessedIR(std::ostream &os, bool shortendIR) const;
149+
void emitPreprocessedIR(std::ostream &os = std::cout,
150+
bool shortendIR = true) const;
150151

151152
/**
152153
* Allows the (de-)serialization of Instructions, Arguments, GlobalValues and

0 commit comments

Comments
 (0)