美文网首页
LLVM注入覆盖率采集代码

LLVM注入覆盖率采集代码

作者: 牛奶言兼 | 来源:发表于2022-11-15 11:08 被阅读0次

在查看gcov的实现原理时,通过对clang/llvm的源码查看和调试,对代码注入有个简单的认识。猜测是通过ModulePass对LLVM IR进行修改调整,具体细节还需要再深挖一下(超纲😫)。

clang!(anonymous namespace)::GCOVProfiler::emitProfileArcs() (./llvm-project-11.0.0//llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp:918)
clang!(anonymous namespace)::GCOVProfiler::runOnModule(llvm::Module&, std::__1::function<llvm::TargetLibraryInfo const& (llvm::Function&)>) (./llvm-project-11.0.0//llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp:564)
clang!(anonymous namespace)::GCOVProfilerLegacyPass::runOnModule(llvm::Module&) (./llvm-project-11.0.0//llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp:168)
clang!(anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) (./llvm-project-11.0.0//llvm/lib/IR/LegacyPassManager.cpp:1617)
clang!llvm::legacy::PassManagerImpl::run(llvm::Module&) (./llvm-project-11.0.0//llvm/lib/IR/LegacyPassManager.cpp:614)
clang!llvm::legacy::PassManager::run(llvm::Module&) (./llvm-project-11.0.0//llvm/lib/IR/LegacyPassManager.cpp:1737)
clang!(anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) (./llvm-project-11.0.0//clang/lib/CodeGen/BackendUtil.cpp:960)
clang!clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) (./llvm-project-11.0.0//clang/lib/CodeGen/BackendUtil.cpp:1676)
clang!clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (./llvm-project-11.0.0//clang/lib/CodeGen/CodeGenAction.cpp:335)
clang!clang::ParseAST(clang::Sema&, bool, bool) (./llvm-project-11.0.0//clang/lib/Parse/ParseAST.cpp:171)
clang!clang::ASTFrontendAction::ExecuteAction() (./llvm-project-11.0.0//clang/lib/Frontend/FrontendAction.cpp:1057)
clang!clang::CodeGenAction::ExecuteAction() (./llvm-project-11.0.0//clang/lib/CodeGen/CodeGenAction.cpp:1184)
clang!clang::FrontendAction::Execute() (./llvm-project-11.0.0//clang/lib/Frontend/FrontendAction.cpp:950)
clang!clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (./llvm-project-11.0.0//clang/lib/Frontend/CompilerInstance.cpp:984)
clang!clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (./llvm-project-11.0.0//clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:278)
clang!cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (./llvm-project-11.0.0//clang/tools/driver/cc1_main.cpp:240)
clang!ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) (./llvm-project-11.0.0//clang/tools/driver/driver.cpp:330)
clang!clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, bool*) const::$_1::operator()() const (./llvm-project-11.0.0//clang/lib/Driver/Job.cpp:400)
clang!void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, bool*) const::$_1>(long) (./llvm-project-11.0.0//llvm/include/llvm/ADT/STLExtras.h:185)
clang!llvm::function_ref<void ()>::operator()() const (./llvm-project-11.0.0//llvm/include/llvm/ADT/STLExtras.h:203)
clang!llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (./llvm-project-11.0.0//llvm/lib/Support/CrashRecoveryContext.cpp:418)
clang!clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, bool*) const (./llvm-project-11.0.0//clang/lib/Driver/Job.cpp:400)
clang!clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&) const (./llvm-project-11.0.0//clang/lib/Driver/Compilation.cpp:195)
clang!clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::__1::pair<int, clang::driver::Command const*> >&) const (./llvm-project-11.0.0//clang/lib/Driver/Compilation.cpp:246)
clang!clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::__1::pair<int, clang::driver::Command const*> >&) (./llvm-project-11.0.0//clang/lib/Driver/Driver.cpp:1506)
clang!main (./llvm-project-11.0.0//clang/tools/driver/driver.cpp:502)
dyld!start (未知源:0)

相关文章

  • Clang插桩

    配置Clang插桩 LLVM内置了一个简单的代码覆盖率检测工具(SanitizerCoverage)。它在函数级、...

  • iOS 启动优化-编译期插桩

    一、通过插桩获取方法符号 LLVM内置了一个简单的代码覆盖率检测工具(SanitizerCoverage)。它在函...

  • Web端PHP代码函数覆盖率测试解决方案

    1. 关于代码覆盖率 衡量代码覆盖率有很多种层次,比如行覆盖率,函数/方法覆盖率,类覆盖率,分支覆盖率等等。代码覆...

  • vim的YouCompleteMe插件安装Clang支持

    1. 下载llvm的源代码 wget http://llvm.org/releases/3.6.0/llvm-3....

  • 当谈论覆盖率时我们在谈什么?

    代码覆盖率 vs. 测试覆盖率 代码覆盖率通常指跑完测试后, 由工具自动统计的在跑测试的过程中被测代码的覆盖率, ...

  • Hello Trust App(高通)

    CP代码下载 CP代码编译方法 交叉编译工具下载 在高通网站上下载llvm, llvm编译器版本,可以在llvm....

  • 代码混淆

    LLVM编译过程: 预处理,词法分析,token,语法分析,AST,代码生成,LLVM IR,优化,生成,汇编代码...

  • 25-覆盖率概述

    ​ 可以添加定向测试,来填补那些覆盖率漏洞, 代码覆盖率 代码覆盖率在编译仿真的时候设置,即可自动收集信息, 功能覆盖率

  • 代码覆盖率-JaCoCo

    代码覆盖率 在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,...

  • 使用JaCoCo统计java代码覆盖率

    代码覆盖率 在白盒测试中,主要使用代码覆盖率来评判白盒测试完成的程度。代码覆盖率是指:在测试中,所执行的源代码占全...

网友评论

      本文标题:LLVM注入覆盖率采集代码

      本文链接:https://www.haomeiwen.com/subject/bwisxdtx.html