lkml.org 
[lkml]   [2016]   [Nov]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 22/34] perf clang jit: Wrap llvm::Module using PerfModule
    Date
    Use PerfModule wrap llvm::Module and return perf::PerfModule in APIs to
    replace llvm::Module. Following commits are going to add new functions
    to PerfModule.

    getBPFObjectFromModule is merged to a method of perf::PerfModule.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    ---
    tools/perf/util/c++/clang-test.cpp | 10 +++++-----
    tools/perf/util/c++/clang.cpp | 20 +++++++++++++-------
    tools/perf/util/c++/clang.h | 22 ++++++++++++++++------
    3 files changed, 34 insertions(+), 18 deletions(-)

    diff --git a/tools/perf/util/c++/clang-test.cpp b/tools/perf/util/c++/clang-test.cpp
    index 9b11e8c..fb05e56 100644
    --- a/tools/perf/util/c++/clang-test.cpp
    +++ b/tools/perf/util/c++/clang-test.cpp
    @@ -13,18 +13,18 @@ public:
    ~perf_clang_scope() {perf_clang__cleanup();}
    };

    -static std::unique_ptr<llvm::Module>
    +static std::unique_ptr<perf::PerfModule>
    __test__clang_to_IR(void)
    {
    unsigned int kernel_version;

    if (fetch_kernel_version(&kernel_version, NULL, 0))
    - return std::unique_ptr<llvm::Module>(nullptr);
    + return std::unique_ptr<perf::PerfModule>(nullptr);

    std::string cflag_kver("-DLINUX_VERSION_CODE=" +
    std::to_string(kernel_version));

    - std::unique_ptr<llvm::Module> M =
    + std::unique_ptr<perf::PerfModule> M =
    perf::getModuleFromSource({cflag_kver.c_str()},
    "perf-test.c",
    test_llvm__bpf_base_prog);
    @@ -39,7 +39,7 @@ int test__clang_to_IR(void)
    auto M = __test__clang_to_IR();
    if (!M)
    return -1;
    - for (llvm::Function& F : *M)
    + for (llvm::Function& F : *(M->getModule()))
    if (F.getName() == "bpf_func__SyS_epoll_wait")
    return 0;
    return -1;
    @@ -53,7 +53,7 @@ int test__clang_to_obj(void)
    if (!M)
    return -1;

    - auto Buffer = perf::getBPFObjectFromModule(&*M);
    + auto Buffer = M->toBPFObject();
    if (!Buffer)
    return -1;
    return 0;
    diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp
    index 3a3b9791..d31b0a5 100644
    --- a/tools/perf/util/c++/clang.cpp
    +++ b/tools/perf/util/c++/clang.cpp
    @@ -64,7 +64,7 @@ createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path,
    return CI;
    }

    -static std::unique_ptr<llvm::Module>
    +static std::unique_ptr<PerfModule>
    getModuleFromSource(llvm::opt::ArgStringList CFlags,
    StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS)
    {
    @@ -80,12 +80,12 @@ getModuleFromSource(llvm::opt::ArgStringList CFlags,

    std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
    if (!Clang.ExecuteAction(*Act))
    - return std::unique_ptr<llvm::Module>(nullptr);
    + return std::unique_ptr<PerfModule>(nullptr);

    - return Act->takeModule();
    + return std::unique_ptr<PerfModule>(new PerfModule(std::move(Act->takeModule())));
    }

    -std::unique_ptr<llvm::Module>
    +std::unique_ptr<PerfModule>
    getModuleFromSource(llvm::opt::ArgStringList CFlags,
    StringRef Name, StringRef Content)
    {
    @@ -106,15 +106,21 @@ getModuleFromSource(llvm::opt::ArgStringList CFlags,
    return getModuleFromSource(std::move(CFlags), Name, OverlayFS);
    }

    -std::unique_ptr<llvm::Module>
    +std::unique_ptr<PerfModule>
    getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path)
    {
    IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem());
    return getModuleFromSource(std::move(CFlags), Path, VFS);
    }

    +PerfModule::PerfModule(std::unique_ptr<llvm::Module>&& M) : Module(std::move(M))
    +{
    +
    +}
    +
    +
    std::unique_ptr<llvm::SmallVectorImpl<char>>
    -getBPFObjectFromModule(llvm::Module *Module)
    +PerfModule::toBPFObject(void)
    {
    using namespace llvm;

    @@ -278,7 +284,7 @@ int perf_clang__compile_bpf(const char *_filename,
    auto M = getModuleFromSource(std::move(CFlags), Opts.getFileName());
    if (!M)
    return -EINVAL;
    - auto O = getBPFObjectFromModule(&*M);
    + auto O = M->toBPFObject();
    if (!O)
    return -EINVAL;

    diff --git a/tools/perf/util/c++/clang.h b/tools/perf/util/c++/clang.h
    index dd8b042..cbb291b 100644
    --- a/tools/perf/util/c++/clang.h
    +++ b/tools/perf/util/c++/clang.h
    @@ -11,16 +11,26 @@ namespace perf {

    using namespace llvm;

    -std::unique_ptr<Module>
    +class PerfModule {
    +private:
    + std::unique_ptr<llvm::Module> Module;
    +public:
    + inline llvm::Module *getModule(void)
    + {
    + return Module.get();
    + }
    +
    + PerfModule(std::unique_ptr<llvm::Module>&& M);
    +
    + std::unique_ptr<llvm::SmallVectorImpl<char>> toBPFObject(void);
    +};
    +
    +std::unique_ptr<PerfModule>
    getModuleFromSource(opt::ArgStringList CFlags,
    StringRef Name, StringRef Content);

    -std::unique_ptr<Module>
    +std::unique_ptr<PerfModule>
    getModuleFromSource(opt::ArgStringList CFlags,
    StringRef Path);
    -
    -std::unique_ptr<llvm::SmallVectorImpl<char>>
    -getBPFObjectFromModule(llvm::Module *Module);
    -
    }
    #endif
    --
    2.10.1
    \
     
     \ /
      Last update: 2016-11-15 05:08    [W:5.852 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site