dr_checker
dr_checker copied to clipboard
Porting to Clang/LLVM 9
Hi,
Have some success in porting it to more recent LLVM (LLVM 9).
Managed to find new APIs, however with below ones I cannot find them, would need some guidance.
AnalysisHelpers - done Dr_linker EntryPointIdentifier
MainAnalysisPasses - still todo
- /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/src/KernelFunctionChecker.cpp
bool KernelFunctionChecker::is_init_function(const Function *targetFunction) {
if(!targetFunction->isDeclaration()) {
/* TODO: no idea
for(const std::string &curr_sec:KernelFunctionChecker::init_section_names) {
if(targetFunction->getSection() != nullptr && strlen(targetFunction->getSection()) &&
(curr_sec.find(targetFunction->getSection()) != std::string::npos)) {
return true;
}
}
*/
}
return false;
Error:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/src/KernelFunctionChecker.cpp: In member function ‘virtual bool DRCHECKER::KernelFunctionChecker::is_init_function(const llvm::Function*)’:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/src/KernelFunctionChecker.cpp:47:52: error: use of deleted function ‘llvm::StringRef::StringRef(std::nullptr_t)’
if(targetFunction->getSection() != nullptr && strlen(targetFunction->getSection()) &&
^~~~~~~
In file included from /usr/lib/llvm-9/include/llvm/Pass.h:31:0,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/../Customizations/include/FunctionChecker.h:9,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/include/KernelFunctionChecker.h:9,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/src/KernelFunctionChecker.cpp:4:
/usr/lib/llvm-9/include/llvm/ADT/StringRef.h:79:5: note: declared here
StringRef(std::nullptr_t) = delete;
^~~~~~~~~
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/LinuxKernelCustomizations/src/KernelFunctionChecker.cpp:47:98: error: cannot convert ‘llvm::StringRef’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’
if(targetFunction->getSection() != nullptr && strlen(targetFunction->getSection()) &&
^
LinuxKernelCustomizations/CMakeFiles/LinuxKernelCustomizations.dir/build.make:62: recipe for target 'LinuxKernelCustomizations/CMakeFiles/LinuxKernelCustomizations.dir/src/KernelFunctionChecker.cpp.o' failed
make[2]: *** [LinuxKernelCustomizations/CMakeFiles/LinuxKernelCustomizations.dir/src/KernelFunctionChecker.cpp.o] Error 1
CMakeFiles/Makefile2:282: recipe for target 'LinuxKernelCustomizations/CMakeFiles/LinuxKernelCustomizations.dir/all' failed
make[1]: *** [LinuxKernelCustomizations/CMakeFiles/LinuxKernelCustomizations.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
- /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/RangeAnalysis.cpp
/* TODO: no idea
const ConstantInt *constant = CI.getCaseValue();
APInt sigMin = constant->getValue();
APInt sigMax = sigMin;
if (sigMin.getBitWidth() < MAX_BIT_INT) {
sigMin = sigMin.sext(MAX_BIT_INT);
}
if (sigMax.getBitWidth() < MAX_BIT_INT) {
sigMax = sigMax.sext(MAX_BIT_INT);
}
// if (sigMax.slt(sigMin)) {
// sigMax = APInt::getSignedMaxValue(MAX_BIT_INT);
// }
Range Values = Range(sigMin, sigMax);
// Create the interval using the intersection in the branch.
BasicInterval *BI = new BasicInterval(Values);
BBsuccs.push_back(std::make_pair(BI, succ));
*/
Error:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/RangeAnalysis.cpp: In member function ‘void ConstraintGraph::buildValueSwitchMap(const llvm::SwitchInst*)’:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/RangeAnalysis.cpp:2210:38: error: ‘using ConstCaseIt = class llvm::SwitchInst::CaseIteratorImpl<llvm::SwitchInst::CaseHandleImpl<const llvm::SwitchInst, const llvm::ConstantInt, const llvm::BasicBlock> > {aka class llvm::SwitchInst::CaseIteratorImpl<llvm::SwitchInst::CaseHandleImpl<const llvm::SwitchInst, const llvm::ConstantInt, const llvm::BasicBlock> >}’ has no member named ‘getCaseValue’
const ConstantInt *constant = CI.getCaseValue();
^~~~~~~~~~~~
RangeAnalysis/CMakeFiles/RangeAnalysis.dir/build.make:62: recipe for target 'RangeAnalysis/CMakeFiles/RangeAnalysis.dir/src/RangeAnalysis.cpp.o' failed
make[2]: *** [RangeAnalysis/CMakeFiles/RangeAnalysis.dir/src/RangeAnalysis.cpp.o] Error 1
CMakeFiles/Makefile2:172: recipe for target 'RangeAnalysis/CMakeFiles/RangeAnalysis.dir/all' failed
make[1]: *** [RangeAnalysis/CMakeFiles/RangeAnalysis.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 14%] Linking CXX static library libLinuxKernelCustomizations.a
[ 14%] Built target LinuxKernelCustomizations
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
- /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp
void vSSA::getAnalysisUsage(AnalysisUsage &AU) const {
/* TODO: no idea
AU.addRequired<DominanceFrontier>();
AU.addRequired<DominatorTreeWrapperPass>();
*/
}
/* TODO: no idea
DTw_ = &getAnalysis<DominatorTreeWrapperPass>();
DT_ = &DTw_->getDomTree();
DF_ = &getAnalysis<DominanceFrontier>();
*/
Error:
In file included from /usr/lib/llvm-9/include/llvm/Pass.h:363:0,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/include/vSSA.h:11,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp:14:
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h: In instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired() [with PassClass = llvm::DominanceFrontier]’:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp:27:36: required from here
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h:66:39: error: ‘ID’ is not a member of ‘llvm::DominanceFrontier’
return addRequiredID(PassClass::ID);
^
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h: In instantiation of ‘AnalysisType& llvm::Pass::getAnalysis() const [with AnalysisType = llvm::DominanceFrontier]’:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp:43:40: required from here
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h:222:38: error: ‘ID’ is not a member of ‘llvm::DominanceFrontier’
return getAnalysisID<AnalysisType>(&AnalysisType::ID);
^~~~~~~~~~~~~
RangeAnalysis/CMakeFiles/RangeAnalysis.dir/build.make:86: recipe for target 'RangeAnalysis/CMakeFiles/RangeAnalysis.dir/src/vSSA.cpp.o' failed
make[2]: *** [RangeAnalysis/CMakeFiles/RangeAnalysis.dir/src/vSSA.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
CMakeFiles/Makefile2:172: recipe for target 'RangeAnalysis/CMakeFiles/RangeAnalysis.dir/all' failed
make[1]: *** [RangeAnalysis/CMakeFiles/RangeAnalysis.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
Can somebody/you help how to tackle 1,2,3 ?
cc @Machiry
I got others resolved. But blocked now by DominanceFrontier
void vSSA::getAnalysisUsage(AnalysisUsage &AU) const {
//AU.addRequired<DominanceFrontier>();
AU.addRequired<DominatorTreeWrapperPass>();
}
bool vSSA::runOnFunction(Function &F) {
// For some reason, in the DominatorTree pass, an unreachable BasicBlock
// inside a function is considered to be dominated by anything. This goes
// against the definition of dominance in my algorithm, and breaks for
// some programs. Therefore, I decided to remove unreachable blocks from
// the program before the conversion to e-SSA takes place.
removeUnreachableBlocks(F);
DTw_ = &getAnalysis<DominatorTreeWrapperPass>();
DT_ = &DTw_->getDomTree();
//DF_ = &getAnalysis<DominanceFrontier>();
// Iterate over all Basic Blocks of the Function, calling the function that creates sigma functions, if needed
for (Function::iterator Fit = F.begin(), Fend = F.end(); Fit != Fend; ++Fit) {
createSigmasIfNeeded(&*Fit);
}
return true;
}
Uncommenting it brings it to compilation.
What is DominanceFrontier? Is it needed in LLVM 9?
It seems it crunch through without it ... still checking....
cc @Machiry
Thanks,
DominanceFrontier is needed for range analysis. What is the error you are seeing?
Thanks @Machiry
Well it seems to work with it commented out, but when it is there, this is the error
In file included from /usr/lib/llvm-9/include/llvm/Pass.h:363:0,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/include/vSSA.h:11,
from /home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp:14:
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h: In instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired() [with PassClass = llvm::DominanceFrontier]’:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp:27:36: required from here
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h:66:39: error: ‘ID’ is not a member of ‘llvm::DominanceFrontier’
return addRequiredID(PassClass::ID);
^
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h: In instantiation of ‘AnalysisType& llvm::Pass::getAnalysis() const [with AnalysisType = llvm::DominanceFrontier]’:
/home/mk/dr_checker/llvm_analysis/MainAnalysisPasses/RangeAnalysis/src/vSSA.cpp:43:40: required from here
/usr/lib/llvm-9/include/llvm/PassAnalysisSupport.h:222:38: error: ‘ID’ is not a member of ‘llvm::DominanceFrontier’
return getAnalysisID<AnalysisType>(&AnalysisType::ID);
^~~~~~~~~~~~~
RangeAnalysis/CMakeFiles/RangeAnalysis.dir/build.make:86: recipe for target 'RangeAnalysis/CMakeFiles/RangeAnalysis.dir/src/vSSA.cpp.o' failed
make[2]: *** [RangeAnalysis/CMakeFiles/RangeAnalysis.dir/src/vSSA.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
CMakeFiles/Makefile2:172: recipe for target 'RangeAnalysis/CMakeFiles/RangeAnalysis.dir/all' failed
make[1]: *** [RangeAnalysis/CMakeFiles/RangeAnalysis.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
So with LLVM 9, 10 it seems to work. Verifying now with Kernel 5.3.x. Will see.
With newer LLVM 13, possibly 14 there are even more changes.
Figured it out. Seem to have it working with Clang/LLVM 9 and also 10
Cc @Machiry