dr_checker icon indicating copy to clipboard operation
dr_checker copied to clipboard

Porting to Clang/LLVM 9

Open marcinguy opened this issue 3 years ago • 4 comments

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

  1. /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
  1. /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

  1. /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

marcinguy avatar Aug 26 '21 08:08 marcinguy

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,

marcinguy avatar Aug 26 '21 10:08 marcinguy

DominanceFrontier is needed for range analysis. What is the error you are seeing?

Machiry avatar Aug 26 '21 15:08 Machiry

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.

marcinguy avatar Aug 26 '21 16:08 marcinguy

Figured it out. Seem to have it working with Clang/LLVM 9 and also 10

Cc @Machiry

marcinguy avatar Aug 29 '21 17:08 marcinguy