lkml.org 
[lkml]   [2016]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf clang: Use real file system for #include
    Commit-ID:  77dfa84a843c0bc935a6c8664f2556573e30845f
    Gitweb: http://git.kernel.org/tip/77dfa84a843c0bc935a6c8664f2556573e30845f
    Author: Wang Nan <wangnan0@huawei.com>
    AuthorDate: Sat, 26 Nov 2016 07:03:35 +0000
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Mon, 5 Dec 2016 15:51:44 -0300

    perf clang: Use real file system for #include

    Utilize clang's OverlayFileSystem facility, allow CompilerInstance to
    access real file system.

    With this patch the '#include' directive can be used.

    Add a new getModuleFromSource for real file.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Joe Stringer <joe@ovn.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/20161126070354.141764-12-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/c++/clang.cpp | 44 +++++++++++++++++++++++++++++++------------
    tools/perf/util/c++/clang.h | 3 +++
    2 files changed, 35 insertions(+), 12 deletions(-)

    diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp
    index c17b117..cf96199 100644
    --- a/tools/perf/util/c++/clang.cpp
    +++ b/tools/perf/util/c++/clang.cpp
    @@ -15,6 +15,7 @@
    #include "clang/Tooling/Tooling.h"
    #include "llvm/IR/Module.h"
    #include "llvm/Option/Option.h"
    +#include "llvm/Support/FileSystem.h"
    #include "llvm/Support/ManagedStatic.h"
    #include <memory>

    @@ -27,14 +28,6 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx;

    using namespace clang;

    -static vfs::InMemoryFileSystem *
    -buildVFS(StringRef& Name, StringRef& Content)
    -{
    - vfs::InMemoryFileSystem *VFS = new vfs::InMemoryFileSystem(true);
    - VFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content));
    - return VFS;
    -}
    -
    static CompilerInvocation *
    createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
    {
    @@ -60,17 +53,17 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
    return CI;
    }

    -std::unique_ptr<llvm::Module>
    -getModuleFromSource(StringRef Name, StringRef Content)
    +static std::unique_ptr<llvm::Module>
    +getModuleFromSource(StringRef Path,
    + IntrusiveRefCntPtr<vfs::FileSystem> VFS)
    {
    CompilerInstance Clang;
    Clang.createDiagnostics();

    - IntrusiveRefCntPtr<vfs::FileSystem> VFS = buildVFS(Name, Content);
    Clang.setVirtualFileSystem(&*VFS);

    IntrusiveRefCntPtr<CompilerInvocation> CI =
    - createCompilerInvocation(Name, Clang.getDiagnostics());
    + createCompilerInvocation(Path, Clang.getDiagnostics());
    Clang.setInvocation(&*CI);

    std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
    @@ -80,6 +73,33 @@ getModuleFromSource(StringRef Name, StringRef Content)
    return Act->takeModule();
    }

    +std::unique_ptr<llvm::Module>
    +getModuleFromSource(StringRef Name, StringRef Content)
    +{
    + using namespace vfs;
    +
    + llvm::IntrusiveRefCntPtr<OverlayFileSystem> OverlayFS(
    + new OverlayFileSystem(getRealFileSystem()));
    + llvm::IntrusiveRefCntPtr<InMemoryFileSystem> MemFS(
    + new InMemoryFileSystem(true));
    +
    + /*
    + * pushOverlay helps setting working dir for MemFS. Must call
    + * before addFile.
    + */
    + OverlayFS->pushOverlay(MemFS);
    + MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content));
    +
    + return getModuleFromSource(Name, OverlayFS);
    +}
    +
    +std::unique_ptr<llvm::Module>
    +getModuleFromSource(StringRef Path)
    +{
    + IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem());
    + return getModuleFromSource(Path, VFS);
    +}
    +
    }

    extern "C" {
    diff --git a/tools/perf/util/c++/clang.h b/tools/perf/util/c++/clang.h
    index f64483b..90aff01 100644
    --- a/tools/perf/util/c++/clang.h
    +++ b/tools/perf/util/c++/clang.h
    @@ -12,5 +12,8 @@ using namespace llvm;
    std::unique_ptr<Module>
    getModuleFromSource(StringRef Name, StringRef Content);

    +std::unique_ptr<Module>
    +getModuleFromSource(StringRef Path);
    +
    }
    #endif
    \
     
     \ /
      Last update: 2016-12-06 09:25    [W:2.803 / U:1.568 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site