diff --git a/src/bin2llvmir/optimizations/param_return/param_return.cpp b/src/bin2llvmir/optimizations/param_return/param_return.cpp index 48d4d0986..f02933606 100644 --- a/src/bin2llvmir/optimizations/param_return/param_return.cpp +++ b/src/bin2llvmir/optimizations/param_return/param_return.cpp @@ -108,6 +108,33 @@ bool ParamReturn::run() return false; } +void SOLVE_CALL(std::map& _fnc2calls,llvm::Function* funct,std::vector& added,std::unordered_map& before){ + for(auto &f2:_fnc2calls){ + if(f2.first==funct){ + for(auto &bf2:f2.second.getFunction()->getBasicBlockList()){ + for (auto& i : bf2){ + if(auto *func=dyn_cast(&i)){ + if(func->getCalledFunction()==funct){ + break; + } + SOLVE_CALL(_fnc2calls,func->getCalledFunction(),added,before); + } + else if(auto *l=dyn_cast(&i)){ + auto ptr=l->getPointerOperand(); + if(before[ptr]==false&&find(added.begin(),added.end(),ptr)==added.end()){ + before[ptr]=true; + added.push_back(ptr); + } + } + else if(auto *s=dyn_cast(&i)){ + before[s->getPointerOperand()]=true; + } + } + } + } + } +} + /** * Collect possible arguments' stores for all calls we want to analyze. * At the moment, we analyze only indirect or declared function calls with no @@ -153,6 +180,28 @@ void ParamReturn::collectAllCalls() calledVal, createDataFlowEntry(calledVal))).first; } + + std::unordered_map before; + std::vector added; + for (auto& b : f){ + for (auto& i : b){ + if(auto *func=dyn_cast(&i)){ + FUN_CALL(_fnc2calls,func->getCalledFunction(),added,before); + } + else if (auto *store = dyn_cast(&i)) { + Value *storedPtr = store->getPointerOperand(); + before[storedPtr] = true; + } + } + } + llvm::outs()<<"Add:"<getName()==f.getName()){ + for(auto as:added){ + fc.second.addArg(as); + } + } + } addDataFromCall(&fIt->second, call); } diff --git a/src/bin2llvmir/providers/abi/arm64.cpp b/src/bin2llvmir/providers/abi/arm64.cpp index 33c9584b3..7400fb9d4 100644 --- a/src/bin2llvmir/providers/abi/arm64.cpp +++ b/src/bin2llvmir/providers/abi/arm64.cpp @@ -35,7 +35,7 @@ AbiArm64::AbiArm64(llvm::Module* m, Config* c) : bool AbiArm64::isGeneralPurposeRegister(const llvm::Value* val) const { uint32_t rid = getRegisterId(val); - return ARM64_REG_X0 <= rid && rid <= ARM64_REG_X30; + return (ARM64_REG_X0 <= rid && rid <= ARM64_REG_X28)||rid==ARM64_REG_X29||rid==ARM64_REG_X30; } bool AbiArm64::isNopInstruction(cs_insn* insn)