Skip to content

Commit

Permalink
Merge 237f5ae into bac2841
Browse files Browse the repository at this point in the history
  • Loading branch information
ste-lam committed Mar 16, 2023
2 parents bac2841 + 237f5ae commit 307bd9d
Show file tree
Hide file tree
Showing 31 changed files with 2,499 additions and 93 deletions.
4 changes: 3 additions & 1 deletion lib/passes/Commandline.cpp
Expand Up @@ -93,7 +93,9 @@ static cl::opt<typeart::analysis::FilterImplementation> cl_typeart_call_filter_i
cl::values(clEnumValN(typeart::analysis::FilterImplementation::none, "none", "No filter"),
clEnumValN(typeart::analysis::FilterImplementation::standard, "std",
"Standard forward filter (default)"),
clEnumValN(typeart::analysis::FilterImplementation::cg, "cg", "Call-graph-based filter")),
clEnumValN(typeart::analysis::FilterImplementation::cg, "cg", "Call-graph-based filter"),
clEnumValN(typeart::analysis::FilterImplementation::acg, "acg",
"Call-graph-based filter (distinguishes arguments)")),
cl::Hidden, cl::init(typeart::analysis::FilterImplementation::standard), cl::cat(typeart_analysis_category));

static cl::opt<ConfigStdArgTypes::filter_glob_ty> cl_typeart_call_filter_glob(
Expand Down
4 changes: 3 additions & 1 deletion lib/passes/TypeARTPass.cpp
Expand Up @@ -287,7 +287,9 @@ void TypeArtPass::printStats(llvm::raw_ostream& out) {
return " [Stack]";
}

llvm_unreachable("Did not find heap or stack, or combination thereof!");
return " [Nop mode]";
// happens when both heap and stack phases are disabled
// llvm_unreachable("Did not find heap or stack, or combination thereof!");
};

Table stats("TypeArtPass");
Expand Down
62 changes: 43 additions & 19 deletions lib/passes/analysis/MemInstFinder.cpp
Expand Up @@ -9,15 +9,18 @@
//
// SPDX-License-Identifier: BSD-3-Clause
//

#include "MemInstFinder.h"

#include "MemOpVisitor.h"
#include "analysis/MemOpData.h"
#include "filter/ACGForwardFilter.h"
#include "filter/CGForwardFilter.h"
#include "filter/CGInterface.h"
#include "filter/Filter.h"
#include "filter/JSONHelper.h"
#include "filter/Matcher.h"
#include "filter/MetaCG.h"
#include "filter/MetaCGExtension.h"
#include "filter/StdForwardFilter.h"
#include "support/Configuration.h"
#include "support/Logger.h"
Expand Down Expand Up @@ -100,27 +103,48 @@ namespace filter {
namespace detail {
static std::unique_ptr<typeart::filter::Filter> make_filter(const MemInstFinderConfig& config) {
using namespace typeart::filter;
const auto filter_id = config.filter.implementation;
using namespace typeart::filter::util;
using namespace typeart::util;

const auto filter_id = config.filter.useCallFilter ? config.filter.implementation : FilterImplementation::none;
const std::string glob = config.filter.callFilterGlob;

if (filter_id == FilterImplementation::none || !config.filter.useCallFilter) {
LOG_DEBUG("Return no-op filter")
return std::make_unique<NoOpFilter>();
} else if (filter_id == FilterImplementation::cg) {
if (config.filter.callFilterCgFile.empty()) {
LOG_FATAL("CG File not set!");
std::exit(1);
switch (filter_id) {
case FilterImplementation::none: {
LOG_DEBUG("Return no-op filter")
return std::make_unique<NoOpFilter>();
}

case FilterImplementation::standard: {
LOG_DEBUG("Return default filter")
auto matcher = std::make_unique<DefaultStringMatcher>(glob2regex(glob));
const auto deep_glob = config.filter.callFilterDeepGlob;
auto deep_matcher = std::make_unique<DefaultStringMatcher>(glob2regex(deep_glob));
return std::make_unique<StandardForwardFilter>(std::move(matcher), std::move(deep_matcher));
}

case FilterImplementation::cg: {
LOG_DEBUG("Return CG filter with CG file @ " << config.filter.callFilterCgFile)
auto json_cg_ex = getJSON(config.filter.callFilterCgFile);
if (!json_cg_ex) {
LOG_FATAL("Cannot open JSON file: " << config.filter.callFilterCgFile)
std::exit(-1);
}
auto json_cg = std::make_unique<JSONCG>(json_cg_ex.get());
auto matcher = std::make_unique<DefaultStringMatcher>(glob2regex(glob));
return std::make_unique<CGForwardFilter>(glob, std::move(json_cg), std::move(matcher));
}

case FilterImplementation::acg: {
LOG_DEBUG("Return ACG filter with CG file @ " << config.filter.callFilterCgFile)
auto json_cg_ex = getJSON<JsonACG>(config.filter.callFilterCgFile);
if (!json_cg_ex) {
LOG_FATAL("Cannot open JSON file: " << config.filter.callFilterCgFile)
std::exit(-1);
}
const Regex target_matcher{glob2regex(glob), Regex::NoFlags};
return std::make_unique<ACGForwardFilter>(createDatabase(target_matcher, json_cg_ex.get()));
}
LOG_DEBUG("Return CG filter with CG file @ " << config.filter.callFilterCgFile)
auto json_cg = JSONCG::getJSON(config.filter.callFilterCgFile);
auto matcher = std::make_unique<DefaultStringMatcher>(util::glob2regex(glob));
return std::make_unique<CGForwardFilter>(glob, std::move(json_cg), std::move(matcher));
} else {
LOG_DEBUG("Return default filter")
auto matcher = std::make_unique<DefaultStringMatcher>(util::glob2regex(glob));
const auto deep_glob = config.filter.callFilterDeepGlob;
auto deep_matcher = std::make_unique<DefaultStringMatcher>(util::glob2regex(deep_glob));
return std::make_unique<StandardForwardFilter>(std::move(matcher), std::move(deep_matcher));
}
}
} // namespace detail
Expand Down
2 changes: 1 addition & 1 deletion lib/passes/analysis/MemInstFinder.h
Expand Up @@ -30,7 +30,7 @@ class Configuration;

namespace typeart::analysis {

enum class FilterImplementation { none, standard, cg };
enum class FilterImplementation { none, standard, cg, acg };

struct FunctionData {
MallocDataList mallocs;
Expand Down

0 comments on commit 307bd9d

Please sign in to comment.