Skip to content

Commit

Permalink
1. add LLVM Byte size helper functions to AddrStmt
Browse files Browse the repository at this point in the history
2. add MaxByteLimit Option
  • Loading branch information
jiawei.wang committed Nov 24, 2023
1 parent d470e6f commit 59f847f
Show file tree
Hide file tree
Showing 6 changed files with 275 additions and 0 deletions.
228 changes: 228 additions & 0 deletions svf-llvm/lib/LLVMUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1268,6 +1268,234 @@ s64_t LLVMUtil::getCaseValue(const SwitchInst &switchInst, SuccBBAndCondValPair

namespace SVF
{


/**
* Determines whether the memory allocation size associated with this AddrStmt is constant.
*
* @return True if the allocation size is constant, false otherwise.
*/
bool AddrStmt::isConstantAllocSize() const {

Check warning on line 1278 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1278

Added line #L1278 was not covered by tests
// Retrieve the LLVM Value associated with this AddrStmt from the LLVMModuleSet.
const llvm::Value* value = LLVMModuleSet::getLLVMModuleSet()->getLLVMValue(this->getLHSVar()->getValue());

Check warning on line 1280 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1280

Added line #L1280 was not covered by tests

// Assert failure if there's no associated LLVM Value.
if (!value) {
assert(false && "this AddrStmt has no LLVM Value");

Check warning on line 1284 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1283-L1284

Added lines #L1283 - L1284 were not covered by tests
}

// Handle the case where the value is an AllocaInst (stack allocation).
if (const llvm::AllocaInst* allocaInst = llvm::dyn_cast<llvm::AllocaInst>(value)) {

Check warning on line 1288 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1288

Added line #L1288 was not covered by tests
const llvm::Value* sizeOperand = allocaInst->getArraySize();
// Check if the size of the allocation is a constant integer.
return llvm::isa<llvm::ConstantInt>(sizeOperand);
}
// Handle the case where the value is a GlobalVariable.
else if (const llvm::GlobalVariable* globalVar = llvm::dyn_cast<llvm::GlobalVariable>(value)) {

Check warning on line 1294 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1294

Added line #L1294 was not covered by tests
// Check if the GlobalVariable is constant.
return globalVar->isConstant();

Check warning on line 1296 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1296

Added line #L1296 was not covered by tests
}
// Handle the case where the value is a CallInst (dynamic memory allocation).
else if (const llvm::CallInst* callInst = llvm::dyn_cast<llvm::CallInst>(value)) {
if (const llvm::Function* calledFunction = callInst->getCalledFunction()) {
std::string functionName = calledFunction->getName().str();

Check warning on line 1301 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1299-L1301

Added lines #L1299 - L1301 were not covered by tests

// Check if the function called is 'malloc'.
if (functionName == "malloc") {
if (callInst->getNumOperands() > 0) {
const llvm::Value* arg = callInst->getArgOperand(0);

Check warning on line 1306 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1304-L1306

Added lines #L1304 - L1306 were not covered by tests
// Check if the argument to malloc is a constant integer.
return llvm::isa<llvm::ConstantInt>(arg);
}
}
// Check if the function called is 'calloc'.
else if (functionName == "calloc") {
if (callInst->getNumOperands() > 1) {
const llvm::Value* arg1 = callInst->getArgOperand(0);
const llvm::Value* arg2 = callInst->getArgOperand(1);

Check warning on line 1315 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1312-L1315

Added lines #L1312 - L1315 were not covered by tests
// Check if both arguments to calloc are constant integers.
return llvm::isa<llvm::ConstantInt>(arg1) && llvm::isa<llvm::ConstantInt>(arg2);

Check warning on line 1317 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1317

Added line #L1317 was not covered by tests
}
}
// Handle other similar functions for memory allocation.
else {
if (callInst->getNumOperands() > 0) {
const llvm::Value* arg = callInst->getArgOperand(0);

Check warning on line 1323 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1322-L1323

Added lines #L1322 - L1323 were not covered by tests
// Check if the first argument is a constant integer.
return llvm::isa<llvm::ConstantInt>(arg);
}
// Assert failure if the allocation function does not have any arguments.
assert(false && "alloc function has no arg");

Check warning on line 1328 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1328

Added line #L1328 was not covered by tests
}
}
// Assert failure if there's no function called in this AddrStmt.
else {
assert(false && "this AddrStmt has no called Function");

Check warning on line 1333 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1333

Added line #L1333 was not covered by tests
}
}
// Handle the case where the instruction is unknown and not an allocation/malloc/global variable.
else {
assert(false && "unknown inst, it is not Alloc/Malloc/GlobalValue");

Check warning on line 1338 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1338

Added line #L1338 was not covered by tests
}

return false;

Check warning on line 1341 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1341

Added line #L1341 was not covered by tests
}


/**
* Retrieves the constant byte size of the memory allocation associated with this AddrStmt.
*
* @return The byte size of the memory allocation if it is constant.
* Throws an assertion if the size is not constant or the LLVM value is not recognized.
*/
u32_t AddrStmt::getConstLLVMByteSize() const {

Check warning on line 1351 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1351

Added line #L1351 was not covered by tests
// Retrieve the LLVM Value associated with this AddrStmt.
const llvm::Value* value = LLVMModuleSet::getLLVMModuleSet()->getLLVMValue(this->getLHSVar()->getValue());

Check warning on line 1353 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1353

Added line #L1353 was not covered by tests

// Assert failure if there's no associated LLVM Value.
if (!value) {
assert(false && "this AddrStmt has no LLVM Value");

Check warning on line 1357 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1356-L1357

Added lines #L1356 - L1357 were not covered by tests
}

// Handle the case where the value is an AllocaInst (stack allocation).
if (const llvm::AllocaInst* allocaInst = llvm::dyn_cast<llvm::AllocaInst>(value)) {

Check warning on line 1361 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1361

Added line #L1361 was not covered by tests
// Check if the size of the allocation is a constant integer.
if (const llvm::ConstantInt* constSizeVal = llvm::dyn_cast<llvm::ConstantInt>(allocaInst->getArraySize())) {

Check warning on line 1363 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1363

Added line #L1363 was not covered by tests
// Retrieve the number of elements to be allocated.
uint64_t numElements = constSizeVal->getZExtValue();

// Retrieve the type being allocated and calculate its size.
llvm::Type* allocatedType = allocaInst->getAllocatedType();
const llvm::DataLayout& dataLayout = allocaInst->getModule()->getDataLayout();
uint64_t elementSize = dataLayout.getTypeAllocSize(allocatedType);

Check warning on line 1370 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1368-L1370

Added lines #L1368 - L1370 were not covered by tests

// Calculate and return the total size of the allocation.
return numElements * elementSize;

Check warning on line 1373 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1373

Added line #L1373 was not covered by tests
}
}
// Handle the case where the value is a GlobalVariable.
else if (const llvm::GlobalVariable* globalVar = llvm::dyn_cast<llvm::GlobalVariable>(value)) {

Check warning on line 1377 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1377

Added line #L1377 was not covered by tests
// If the global variable has an initializer, calculate its size.
if (globalVar->hasInitializer()) {
llvm::Type* type = globalVar->getValueType();
const llvm::DataLayout& dataLayout = globalVar->getParent()->getDataLayout();
return dataLayout.getTypeAllocSize(type);

Check warning on line 1382 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1379-L1382

Added lines #L1379 - L1382 were not covered by tests
}
}
// Handle the case where the value is a CallInst (dynamic memory allocation).
else if (const llvm::CallInst* callInst = llvm::dyn_cast<llvm::CallInst>(value)) {
if (const llvm::Function* calledFunction = callInst->getCalledFunction()) {
std::string functionName = calledFunction->getName().str();

Check warning on line 1388 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1386-L1388

Added lines #L1386 - L1388 were not covered by tests

// Check if the function called is 'malloc' and process its argument.
if (functionName == "malloc" && callInst->getNumOperands() > 0) {
if (const llvm::ConstantInt* arg = llvm::dyn_cast<llvm::ConstantInt>(callInst->getArgOperand(0))) {
return arg->getZExtValue();

Check warning on line 1393 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1391-L1393

Added lines #L1391 - L1393 were not covered by tests
}
}
// Check if the function called is 'calloc' and process its arguments.
else if (functionName == "calloc" && callInst->getNumOperands() > 1) {
if (const llvm::ConstantInt* arg1 = llvm::dyn_cast<llvm::ConstantInt>(callInst->getArgOperand(0))) {
if (const llvm::ConstantInt* arg2 = llvm::dyn_cast<llvm::ConstantInt>(callInst->getArgOperand(1))) {
return arg1->getZExtValue() * arg2->getZExtValue();

Check warning on line 1400 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1397-L1400

Added lines #L1397 - L1400 were not covered by tests
}
}
}
// Handle other similar functions for memory allocation.
else {
if (callInst->getNumOperands() > 0) {
if(const llvm::ConstantInt* arg = llvm::dyn_cast<llvm::ConstantInt>(callInst->getArgOperand(0))){
return arg->getZExtValue();

Check warning on line 1408 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1406-L1408

Added lines #L1406 - L1408 were not covered by tests
}
}
}
}
}
// Assert failure if the allocation size is unknown or the instance is not a recognized type.
assert(false && "unknown alloc size (you should check isConstantAllocSize() first), or unknown inst");

Check warning on line 1415 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1415

Added line #L1415 was not covered by tests
}


/**
* Retrieves the runtime byte size of the memory allocation associated with this AddrStmt.
*
* @return An SVFAllocationInfo object containing the size(s) of the memory allocation and the element size.
* Throws an assertion if the LLVM value is not recognized or the size cannot be determined.
*/
SVFAllocationInfo AddrStmt::getRuntimeLLVMByteSize() const {

Check warning on line 1425 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1425

Added line #L1425 was not covered by tests
// Retrieve the LLVM Value associated with this AddrStmt.
const llvm::Value* value = LLVMModuleSet::getLLVMModuleSet()->getLLVMValue(this->getLHSVar()->getValue());

Check warning on line 1427 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1427

Added line #L1427 was not covered by tests

// Assert failure if there's no associated LLVM Value.
if (!value) {
assert(false && "this AddrStmt has no LLVM Value");

Check warning on line 1431 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1430-L1431

Added lines #L1430 - L1431 were not covered by tests
}

// Vector to store the size(s) of the allocation.
std::vector<const llvm::Value*> sizes;

// Default element size is set to 1.
u32_t elementSize = 1;

// Handle the case where the value is an AllocaInst (stack allocation).
if (const llvm::AllocaInst* allocaInst = llvm::dyn_cast<llvm::AllocaInst>(value)) {

Check warning on line 1441 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1441

Added line #L1441 was not covered by tests
// Add the array size to the sizes vector.
sizes.push_back(allocaInst->getArraySize());

Check warning on line 1443 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1443

Added line #L1443 was not covered by tests

// Retrieve the type being allocated and calculate its size.
llvm::Type* allocatedType = allocaInst->getAllocatedType();
const llvm::DataLayout& dataLayout = allocaInst->getModule()->getDataLayout();
elementSize = dataLayout.getTypeAllocSize(allocatedType);

Check warning on line 1448 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1446-L1448

Added lines #L1446 - L1448 were not covered by tests
}
// Handle the case where the value is a GlobalVariable.
else if (llvm::isa<llvm::GlobalVariable>(value)) {

Check warning on line 1451 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1451

Added line #L1451 was not covered by tests
// Global variables usually have constant sizes, assert failure.
assert (false && "usually the size of global value is const");

Check warning on line 1453 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1453

Added line #L1453 was not covered by tests
}
// Handle the case where the value is a CallInst (dynamic memory allocation).
else if (const llvm::CallInst* callInst = llvm::dyn_cast<llvm::CallInst>(value)) {
if (const llvm::Function* calledFunction = callInst->getCalledFunction()) {
std::string functionName = calledFunction->getName().str();

Check warning on line 1458 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1456-L1458

Added lines #L1456 - L1458 were not covered by tests

// Check if the function called is 'malloc' and process its argument.
if (functionName == "malloc") {
if (callInst->getNumOperands() > 0) {
sizes.push_back(callInst->getArgOperand(0));

Check warning on line 1463 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1461-L1463

Added lines #L1461 - L1463 were not covered by tests
}
}
// Check if the function called is 'calloc' and process its arguments.
else if (functionName == "calloc") {
if (callInst->getNumOperands() > 1) {
sizes.push_back(callInst->getArgOperand(0));
sizes.push_back(callInst->getArgOperand(1));

Check warning on line 1470 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1467-L1470

Added lines #L1467 - L1470 were not covered by tests
}
}
// Handle other similar functions for memory allocation.
else {
if (callInst->getNumOperands() > 0) {
sizes.push_back(callInst->getArgOperand(0));

Check warning on line 1476 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1475-L1476

Added lines #L1475 - L1476 were not covered by tests
}
}
}
}

// Assert failure if the allocation instruction is unknown.
assert(sizes.size() > 0 && "unknown alloc inst");

Check warning on line 1483 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1483

Added line #L1483 was not covered by tests

// Vector to store the SVFValues corresponding to the LLVM Values.
std::vector<const SVFValue*> svfSizes;
// Transform LLVM Values to SVFValues.
std::transform(sizes.begin(), sizes.end(), svfSizes.begin(),
[](const llvm::Value* value) -> const SVFValue* {
return LLVMModuleSet::getLLVMModuleSet()->getSVFValue(value);
}
);

Check warning on line 1492 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1492

Added line #L1492 was not covered by tests

// Return the allocation information.
return SVFAllocationInfo(svfSizes, elementSize);

Check warning on line 1495 in svf-llvm/lib/LLVMUtil.cpp

View check run for this annotation

Codecov / codecov/patch

svf-llvm/lib/LLVMUtil.cpp#L1495

Added line #L1495 was not covered by tests
}


// getLLVMByteSize
u32_t SVFType::getLLVMByteSize() const
{
Expand Down
9 changes: 9 additions & 0 deletions svf/include/SVFIR/SVFStatements.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,15 @@ class AddrStmt: public AssignStmt
AddrStmt(SVFVar* s, SVFVar* d) : AssignStmt(s, d, SVFStmt::Addr) {}

virtual const std::string toString() const override;

/// Determines whether the memory allocation size associated with this AddrStmt is constant.
bool isConstantAllocSize() const;

/// Retrieves the constant byte size of the memory allocation associated with this AddrStmt.
u32_t getConstLLVMByteSize() const;

/// Retrieves the runtime byte size of the memory allocation associated with this AddrStmt.
SVFAllocationInfo getRuntimeLLVMByteSize() const;
};

/*!
Expand Down
11 changes: 11 additions & 0 deletions svf/include/SVFIR/SVFValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,17 @@ class SVFMetadataAsValue : public SVFOtherValue
}
};

/*
* This class is only for AddrStmt's runtime allocated bytes
*/
struct SVFAllocationInfo {
std::vector<const SVFValue*> sizes;
u32_t elementSize;

SVFAllocationInfo(std::vector<const SVFValue*> sizes, u32_t elementSize)
: sizes(std::move(sizes)), elementSize(elementSize) {}

Check warning on line 1109 in svf/include/SVFIR/SVFValue.h

View check run for this annotation

Codecov / codecov/patch

svf/include/SVFIR/SVFValue.h#L1109

Added line #L1109 was not covered by tests
};


class CallSite
{
Expand Down
3 changes: 3 additions & 0 deletions svf/include/Util/Options.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ class Options
/// Maximum number of field derivations for an object.
static const Option<u32_t> MaxFieldLimit;

/// Maximum number of byte offset for an object
static const Option<u32_t> MaxByteLimit;

/// Whether to stage Andersen's with Steensgaard and cluster based on that data.
static const Option<bool> ClusterAnder;

Expand Down
18 changes: 18 additions & 0 deletions svf/lib/SVFIR/SVFStatements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,24 @@ const std::string SVFStmt::toString() const
return rawstr.str();
}

__attribute__((weak))
bool AddrStmt::isConstantAllocSize() const {
assert("AddrStmt::isConstantAllocSize should be implemented or supported by fronted" && false);

Check warning on line 76 in svf/lib/SVFIR/SVFStatements.cpp

View check run for this annotation

Codecov / codecov/patch

svf/lib/SVFIR/SVFStatements.cpp#L75-L76

Added lines #L75 - L76 were not covered by tests
abort();
}

__attribute__((weak))
u32_t AddrStmt::getConstLLVMByteSize() const {
assert("AddrStmt::getConstLLVMByteSize should be implemented or supported by fronted" && false);

Check warning on line 82 in svf/lib/SVFIR/SVFStatements.cpp

View check run for this annotation

Codecov / codecov/patch

svf/lib/SVFIR/SVFStatements.cpp#L81-L82

Added lines #L81 - L82 were not covered by tests
abort();
}

__attribute__((weak))
SVFAllocationInfo AddrStmt::getRuntimeLLVMByteSize() const {
assert("AddrStmt::getRuntimeLLVMByteSize should be implemented or supported by fronted" && false);

Check warning on line 88 in svf/lib/SVFIR/SVFStatements.cpp

View check run for this annotation

Codecov / codecov/patch

svf/lib/SVFIR/SVFStatements.cpp#L87-L88

Added lines #L87 - L88 were not covered by tests
abort();
}

const std::string AddrStmt::toString() const
{
std::string str;
Expand Down
6 changes: 6 additions & 0 deletions svf/lib/Util/Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ const Option<u32_t> Options::MaxFieldLimit(
512
);

const Option<u32_t> Options::MaxByteLimit(
"byte-limit",
"Maximum number of byte offset for field sensitive analysis",
99999
);

const OptionMap<BVDataPTAImpl::PTBackingType> Options::ptDataBacking(
"ptd",
"Overarching points-to data structure",
Expand Down

0 comments on commit 59f847f

Please sign in to comment.