在查看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)
网友评论