Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754273AbcK1Gno (ORCPT ); Mon, 28 Nov 2016 01:43:44 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:14814 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751725AbcK1Gnj (ORCPT ); Mon, 28 Nov 2016 01:43:39 -0500 Subject: Re: [PATCH v3 20/30] perf clang jit: add PerfModule::doJIT to JIT perfhook functions To: Alexei Starovoitov References: <20161126070354.141764-1-wangnan0@huawei.com> <20161126070354.141764-21-wangnan0@huawei.com> <20161126172934.GG83987@ast-mbp.thefacebook.com> CC: , , , , , , , Jiri Olsa From: "Wangnan (F)" Message-ID: <583BD1B8.7060901@huawei.com> Date: Mon, 28 Nov 2016 14:42:00 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 In-Reply-To: <20161126172934.GG83987@ast-mbp.thefacebook.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2012 Lines: 60 On 2016/11/27 1:29, Alexei Starovoitov wrote: > 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 > ... >> + 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 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. I'll put a perf-clang.txt in tools/perf/Documentation. Thank you. > Acked-by: Alexei Starovoitov >