On Sat, Nov 26, 2016 at 07:03:44AM +0000, Wang Nan wrote: > PerfModule::doJIT JIT compile perfhook functions and saves result into > a map. Add a test case for it. > > At this stage perfhook functions can do no useful things because they > can't invoke external functions and can't return value. Following > commits are going to make improvment. > > Don't hook functions right after jitted because bpf_object is unavailable > during jitting but it should be the context of jitted functions. > > Signed-off-by: Wang Nan <wangn...@huawei.com> ... > + for (Function *F : JITFunctions) { > + JITSymbol sym = CompileLayer.findSymbol(F->getName().str(), > true); > + > + /* > + * Type of F->getSection() is moving from > + * const char * to StringRef. > + * Convert it to std::string so we don't need > + * consider this API change. > + */ > + std::string sec(F->getSection()); > + std::string hook(&sec.c_str()[sizeof("perfhook:") - 1]); > + perf_hook_func_t func = > (perf_hook_func_t)(intptr_t)sym.getAddress(); > + > + if (JITResult[hook]) > + llvm::errs() << "Warning: multiple functions on hook " > + << hook << ", only one is used\n"; > + JITResult[hook] = func; > + } > + return 0; > +} > + > class ClangOptions { > llvm::SmallString<PATH_MAX> FileName; > llvm::SmallString<64> KVerDef; > @@ -292,6 +359,10 @@ void perf_clang__init(void) > LLVMInitializeBPFTarget(); > LLVMInitializeBPFTargetMC(); > LLVMInitializeBPFAsmPrinter(); > + > + llvm::InitializeNativeTarget(); > + llvm::InitializeNativeTargetAsmPrinter(); > + llvm::InitializeNativeTargetAsmParser();
Looks great. I bet a lot of people reading perf code won't be able to understand what you're doing here. Could you please add a design doc on how perf<->clang/llvm interaction is done. Acked-by: Alexei Starovoitov <a...@kernel.org>