From 3966c06fe64a7137f568937fac4ddeee78368c3e Mon Sep 17 00:00:00 2001 From: DavidKorczynski Date: Fri, 12 Jan 2024 15:57:29 +0000 Subject: [PATCH] frontends: llvm: include function source code end line (#1357) Signed-off-by: David Korczynski --- .../FuzzIntrospector/FuzzIntrospector.cpp | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/frontends/llvm/lib/Transforms/FuzzIntrospector/FuzzIntrospector.cpp b/frontends/llvm/lib/Transforms/FuzzIntrospector/FuzzIntrospector.cpp index 63e7457e9..102da82d1 100644 --- a/frontends/llvm/lib/Transforms/FuzzIntrospector/FuzzIntrospector.cpp +++ b/frontends/llvm/lib/Transforms/FuzzIntrospector/FuzzIntrospector.cpp @@ -96,6 +96,7 @@ typedef struct fuzzFuncWrapper { std::string FunctionSourceFile; std::string LinkageType; int FunctionLinenumber; + unsigned int FunctionLinenumberEnd; size_t FunctionDepth; std::string ReturnType; size_t ArgCount; @@ -151,6 +152,7 @@ template <> struct yaml::MappingTraits { io.mapRequired("functionSourceFile", Func.FunctionSourceFile); io.mapRequired("linkageType", Func.LinkageType); io.mapRequired("functionLinenumber", Func.FunctionLinenumber); + io.mapRequired("functionLinenumberEnd", Func.FunctionLinenumberEnd); io.mapRequired("functionDepth", Func.FunctionDepth); io.mapRequired("returnType", Func.ReturnType); io.mapRequired("argCount", Func.ArgCount); @@ -276,7 +278,8 @@ struct FuzzIntrospector : public ModulePass { // FuzzerFunctionList wrapAllFunctions(Module &M); std::string getFunctionFilename(Function *F); - int getFunctionLinenumber(Function *F); + int getFunctionLinenumberBeginning(Function *F); + unsigned int getFunctionLinenumberEnd(Function *F); std::string resolveTypeName(Type *t); Function *value2Func(Value *Val); bool isFunctionPointerType(Type *type); @@ -549,7 +552,7 @@ StringRef FuzzIntrospector::removeDecSuffixFromName(StringRef FuncName) { return FuncNameBeforeLastPeriod; } -int FuzzIntrospector::getFunctionLinenumber(Function *F) { +int FuzzIntrospector::getFunctionLinenumberBeginning(Function *F) { for (auto &I : instructions(*F)) { const llvm::DebugLoc &DebugInfo = I.getDebugLoc(); if (DebugInfo) { @@ -559,6 +562,20 @@ int FuzzIntrospector::getFunctionLinenumber(Function *F) { return -1; } +unsigned int FuzzIntrospector::getFunctionLinenumberEnd(Function *F) { + unsigned int MaxLineNumber = 0; + + for (auto &I : instructions(*F)) { + const llvm::DebugLoc &DebugInfo = I.getDebugLoc(); + if (DebugInfo) { + if (DebugInfo.getLine() > MaxLineNumber) { + MaxLineNumber = DebugInfo.getLine(); + } + } + } + return MaxLineNumber; +} + // Return the path as a string to the file in which // the function is implemented. std::string FuzzIntrospector::getFunctionFilename(Function *F) { @@ -1014,7 +1031,8 @@ FuzzerFunctionWrapper FuzzIntrospector::wrapFunction(Function *F) { FuncWrap.FunctionName = removeDecSuffixFromName(F->getName()); FuncWrap.FunctionSourceFile = getFunctionFilename(F); - FuncWrap.FunctionLinenumber = getFunctionLinenumber(F); + FuncWrap.FunctionLinenumber = getFunctionLinenumberBeginning(F); + FuncWrap.FunctionLinenumberEnd = getFunctionLinenumberEnd(F); FuncWrap.FunctionUses = 0; for (User *U : F->users()) { if (Instruction *Inst = dyn_cast(U)) {