Skip to content

Commit c11482c

Browse files
Simplifications in Helper Analyses (#740)
* some changes * minor in CG * minor * Quick-fix LLVMTypeHierarchyTest --------- Co-authored-by: Sriteja Kummita <38907381+sritejakv@users.noreply.github.com>
1 parent 234110f commit c11482c

File tree

6 files changed

+42
-53
lines changed

6 files changed

+42
-53
lines changed

include/phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class LLVMBasedICFG : public LLVMBasedCFG, public ICFGBase<LLVMBasedICFG> {
162162
}
163163

164164
[[nodiscard]] llvm::Function *buildCRuntimeGlobalCtorsDtorsModel(
165-
llvm::Module &M, llvm::ArrayRef<llvm::Function *> UserEntryPoints);
165+
LLVMProjectIRDB &IRDB, llvm::ArrayRef<llvm::Function *> UserEntryPoints);
166166

167167
void initialize(LLVMProjectIRDB *IRDB, Resolver &CGResolver,
168168
llvm::ArrayRef<std::string> EntryPoints, Soundness S,

include/phasar/PhasarLLVM/TaintConfig/TaintConfigData.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ struct FunctionData {
2424

2525
std::string Name;
2626
TaintCategory ReturnCat{};
27-
std::vector<uint32_t> SourceValues;
28-
std::vector<uint32_t> SinkValues;
29-
std::vector<uint32_t> SanitizerValues;
27+
std::vector<uint32_t> SourceValues{};
28+
std::vector<uint32_t> SinkValues{};
29+
std::vector<uint32_t> SanitizerValues{};
3030
bool HasAllSinkParam = false;
3131
};
3232

lib/PhasarLLVM/ControlFlow/LLVMBasedCallGraphBuilder.cpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ static bool fillPossibleTargets(
106106
Resolver::FunctionSetTy &PossibleTargets, Resolver &Res,
107107
const llvm::CallBase *CS,
108108
llvm::DenseMap<const llvm::Instruction *, unsigned int> &IndirectCalls) {
109-
if (const auto *StaticCallee = CS->getCalledFunction()) {
109+
if (const auto *StaticCallee = llvm::dyn_cast<llvm::Function>(
110+
CS->getCalledOperand()->stripPointerCastsAndAliases())) {
110111
PossibleTargets.insert(StaticCallee);
111112

112113
PHASAR_LOG_LEVEL_CAT(DEBUG, "LLVMBasedICFG",
@@ -115,16 +116,7 @@ static bool fillPossibleTargets(
115116
return true;
116117
}
117118

118-
// still try to resolve the called function statically
119-
const llvm::Value *SV = CS->getCalledOperand()->stripPointerCastsAndAliases();
120-
if (const auto *ValueFunction = llvm::dyn_cast<llvm::Function>(SV)) {
121-
PossibleTargets.insert(ValueFunction);
122-
PHASAR_LOG_LEVEL_CAT(DEBUG, "LLVMBasedICFG",
123-
"Found static call-site: " << llvmIRToString(CS));
124-
return true;
125-
}
126-
127-
if (llvm::isa<llvm::InlineAsm>(SV)) {
119+
if (llvm::isa<llvm::InlineAsm>(CS->getCalledOperand())) {
128120
return true;
129121
}
130122

lib/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.cpp

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,12 @@ LLVMTypeHierarchy::removeStructOrClassPrefix(const llvm::StructType &T) {
146146
std::string
147147
LLVMTypeHierarchy::removeStructOrClassPrefix(llvm::StringRef TypeName) {
148148
if (TypeName.startswith(StructPrefix)) {
149-
return TypeName.drop_front(StructPrefix.size()).str();
149+
TypeName = TypeName.drop_front(StructPrefix.size());
150+
} else if (TypeName.startswith(ClassPrefix)) {
151+
TypeName = TypeName.drop_front(ClassPrefix.size());
150152
}
151-
if (TypeName.startswith(ClassPrefix)) {
152-
return TypeName.drop_front(ClassPrefix.size()).str();
153+
if (TypeName.endswith(".base")) {
154+
TypeName = TypeName.drop_back(llvm::StringRef(".base").size());
153155
}
154156
return TypeName.str();
155157
}
@@ -231,18 +233,15 @@ LLVMTypeHierarchy::getSubTypes(const llvm::Module & /*M*/,
231233
if (const auto *I =
232234
llvm::dyn_cast<llvm::ConstantStruct>(TI->getInitializer())) {
233235
for (const auto &Op : I->operands()) {
234-
if (auto *CE = llvm::dyn_cast<llvm::ConstantExpr>(Op)) {
235-
if (auto *BC = llvm::dyn_cast<llvm::BitCastOperator>(CE)) {
236-
if (BC->getOperand(0)->hasName()) {
237-
auto Name = BC->getOperand(0)->getName();
238-
if (Name.find(TypeInfoPrefix) != llvm::StringRef::npos) {
239-
auto ClearName =
240-
removeTypeInfoPrefix(llvm::demangle(Name.str()));
241-
if (auto TypeIt = ClearNameTypeMap.find(ClearName);
242-
TypeIt != ClearNameTypeMap.end()) {
243-
SubTypes.push_back(TypeIt->second);
244-
}
245-
}
236+
const auto *CE = Op->stripPointerCastsAndAliases();
237+
238+
if (CE->hasName()) {
239+
auto Name = CE->getName();
240+
if (Name.find(TypeInfoPrefix) != llvm::StringRef::npos) {
241+
auto ClearName = removeTypeInfoPrefix(llvm::demangle(Name.str()));
242+
if (auto TypeIt = ClearNameTypeMap.find(ClearName);
243+
TypeIt != ClearNameTypeMap.end()) {
244+
SubTypes.push_back(TypeIt->second);
246245
}
247246
}
248247
}
@@ -329,8 +328,9 @@ LLVMTypeHierarchy::getSubTypes(const llvm::StructType *Type) const {
329328
return {};
330329
}
331330

332-
const llvm::StructType *
333-
LLVMTypeHierarchy::getType(llvm::StringRef TypeName) const {
331+
template <typename GraphT>
332+
static const llvm::StructType *getTypeImpl(const GraphT &TypeGraph,
333+
llvm::StringRef TypeName) {
334334
for (auto V : boost::make_iterator_range(boost::vertices(TypeGraph))) {
335335
if (TypeGraph[V].Type->getName() == TypeName) {
336336
return TypeGraph[V].Type;
@@ -339,6 +339,17 @@ LLVMTypeHierarchy::getType(llvm::StringRef TypeName) const {
339339
return nullptr;
340340
}
341341

342+
const llvm::StructType *
343+
LLVMTypeHierarchy::getType(llvm::StringRef TypeName) const {
344+
if (const auto *Ty = getTypeImpl(TypeGraph, TypeName)) {
345+
return Ty;
346+
}
347+
348+
// Sometimes, clang adds a .base suffix
349+
std::string TN = TypeName.str() + ".base";
350+
return getTypeImpl(TypeGraph, TypeName);
351+
}
352+
342353
std::vector<const llvm::StructType *> LLVMTypeHierarchy::getAllTypes() const {
343354
std::vector<const llvm::StructType *> Types;
344355
Types.reserve(boost::num_vertices(TypeGraph));

lib/PhasarLLVM/TypeHierarchy/LLVMVFTable.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,10 @@ LLVMVFTable::getVFVectorFromIRVTable(const llvm::ConstantStruct &VT) {
8282
// is RTTI
8383
for (const auto *It = std::next(CA->operands().begin(), 2);
8484
It != CA->operands().end(); ++It) {
85-
const auto &COp = *It;
86-
if (const auto *CE = llvm::dyn_cast<llvm::ConstantExpr>(COp)) {
87-
if (const auto *BC = llvm::dyn_cast<llvm::BitCastOperator>(CE)) {
88-
// if the entry is a GlobalAlias, get its Aliasee
89-
auto *Entry = BC->getOperand(0);
90-
while (auto *GA = llvm::dyn_cast<llvm::GlobalAlias>(Entry)) {
91-
Entry = GA->getAliasee();
92-
}
93-
auto *F = llvm::dyn_cast<llvm::Function>(Entry);
94-
VFS.push_back(F);
95-
} else {
96-
VFS.push_back(nullptr);
97-
}
98-
} else {
99-
VFS.push_back(nullptr);
100-
}
85+
const auto *Entry = It->get()->stripPointerCastsAndAliases();
86+
87+
const auto *F = llvm::dyn_cast<llvm::Function>(Entry);
88+
VFS.push_back(F);
10189
}
10290
}
10391
}

unittests/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchyTest.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ TEST(LTHTest, BasicTHReconstruction_1) {
2727
LLVMProjectIRDB IRDB(unittest::PathToLLTestFiles +
2828
"type_hierarchies/type_hierarchy_1_cpp.ll");
2929
LLVMTypeHierarchy LTH(IRDB);
30-
EXPECT_EQ(LTH.hasType(LTH.getType("struct.Base")), true);
31-
EXPECT_EQ(LTH.hasType(LTH.getType("struct.Child")), true);
30+
31+
ASSERT_EQ(LTH.hasType(LTH.getType("struct.Base")), true);
32+
ASSERT_EQ(LTH.hasType(LTH.getType("struct.Child")), true);
3233
EXPECT_EQ(LTH.getAllTypes().size(), 2U);
3334
EXPECT_EQ(
3435
LTH.isSubType(LTH.getType("struct.Base"), LTH.getType("struct.Child")),
@@ -163,12 +164,10 @@ TEST(LTHTest, BasicTHReconstruction_7) {
163164
LLVMTypeHierarchy LTH(IRDB);
164165
EXPECT_EQ(LTH.hasType(LTH.getType("struct.Base")), true);
165166
EXPECT_EQ(LTH.hasType(LTH.getType("struct.Child")), true);
166-
// has three types because of padding (introduction of intermediate type)
167167
EXPECT_EQ(LTH.getAllTypes().size(), 3U);
168168
EXPECT_EQ(
169169
LTH.isSubType(LTH.getType("struct.Base"), LTH.getType("struct.Child")),
170170
true);
171-
172171
EXPECT_EQ(LTH.getSubTypes(LTH.getType("struct.Base")).size(), 2U);
173172
EXPECT_EQ(LTH.getSubTypes(LTH.getType("struct.Child")).size(), 1U);
174173
auto BaseReachable = LTH.getSubTypes(LTH.getType("struct.Base"));
@@ -268,7 +267,6 @@ TEST(LTHTest, TransitivelyReachableTypes) {
268267
ASSERT_TRUE(ReachableTypesNonvirtualstruct3.size() == 1U);
269268

270269
ASSERT_TRUE(ReachableTypesBase4.count(TH4.getType("struct.Base")));
271-
ASSERT_FALSE(ReachableTypesBase4.count(TH4.getType("struct.Base.base")));
272270
ASSERT_TRUE(ReachableTypesBase4.count(TH4.getType("struct.Child")));
273271
ASSERT_TRUE(ReachableTypesBase4.size() == 2U);
274272
ASSERT_TRUE(ReachableTypesChild4.count(TH4.getType("struct.Child")));

0 commit comments

Comments
 (0)