diff options
| author | Wang Nan <wangnan0@huawei.com> | 2016-11-26 02:03:36 -0500 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-12-05 13:51:44 -0500 |
| commit | a9495fe9dc63bee1166772b6f10e199ef1747892 (patch) | |
| tree | f28475b3a79dce2db7a52cb56afc7f3c04a295bd /tools/perf/util/c++/clang.cpp | |
| parent | 77dfa84a843c0bc935a6c8664f2556573e30845f (diff) | |
perf clang: Allow passing CFLAGS to builtin clang
Improve getModuleFromSource() API to accept a cflags list. This feature
will be used to pass LINUX_VERSION_CODE and -I flags.
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-13-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/c++/clang.cpp')
| -rw-r--r-- | tools/perf/util/c++/clang.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp index cf96199b4b6f..715ca0a3dee0 100644 --- a/tools/perf/util/c++/clang.cpp +++ b/tools/perf/util/c++/clang.cpp | |||
| @@ -29,7 +29,8 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx; | |||
| 29 | using namespace clang; | 29 | using namespace clang; |
| 30 | 30 | ||
| 31 | static CompilerInvocation * | 31 | static CompilerInvocation * |
| 32 | createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) | 32 | createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path, |
| 33 | DiagnosticsEngine& Diags) | ||
| 33 | { | 34 | { |
| 34 | llvm::opt::ArgStringList CCArgs { | 35 | llvm::opt::ArgStringList CCArgs { |
| 35 | "-cc1", | 36 | "-cc1", |
| @@ -45,6 +46,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) | |||
| 45 | "-Wno-unused-value", | 46 | "-Wno-unused-value", |
| 46 | "-Wno-pointer-sign", | 47 | "-Wno-pointer-sign", |
| 47 | "-x", "c"}; | 48 | "-x", "c"}; |
| 49 | |||
| 50 | CCArgs.append(CFlags.begin(), CFlags.end()); | ||
| 48 | CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs); | 51 | CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs); |
| 49 | 52 | ||
| 50 | FrontendOptions& Opts = CI->getFrontendOpts(); | 53 | FrontendOptions& Opts = CI->getFrontendOpts(); |
| @@ -54,8 +57,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) | |||
| 54 | } | 57 | } |
| 55 | 58 | ||
| 56 | static std::unique_ptr<llvm::Module> | 59 | static std::unique_ptr<llvm::Module> |
| 57 | getModuleFromSource(StringRef Path, | 60 | getModuleFromSource(llvm::opt::ArgStringList CFlags, |
| 58 | IntrusiveRefCntPtr<vfs::FileSystem> VFS) | 61 | StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS) |
| 59 | { | 62 | { |
| 60 | CompilerInstance Clang; | 63 | CompilerInstance Clang; |
| 61 | Clang.createDiagnostics(); | 64 | Clang.createDiagnostics(); |
| @@ -63,7 +66,8 @@ getModuleFromSource(StringRef Path, | |||
| 63 | Clang.setVirtualFileSystem(&*VFS); | 66 | Clang.setVirtualFileSystem(&*VFS); |
| 64 | 67 | ||
| 65 | IntrusiveRefCntPtr<CompilerInvocation> CI = | 68 | IntrusiveRefCntPtr<CompilerInvocation> CI = |
| 66 | createCompilerInvocation(Path, Clang.getDiagnostics()); | 69 | createCompilerInvocation(std::move(CFlags), Path, |
| 70 | Clang.getDiagnostics()); | ||
| 67 | Clang.setInvocation(&*CI); | 71 | Clang.setInvocation(&*CI); |
| 68 | 72 | ||
| 69 | std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx)); | 73 | std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx)); |
| @@ -74,7 +78,8 @@ getModuleFromSource(StringRef Path, | |||
| 74 | } | 78 | } |
| 75 | 79 | ||
| 76 | std::unique_ptr<llvm::Module> | 80 | std::unique_ptr<llvm::Module> |
| 77 | getModuleFromSource(StringRef Name, StringRef Content) | 81 | getModuleFromSource(llvm::opt::ArgStringList CFlags, |
| 82 | StringRef Name, StringRef Content) | ||
| 78 | { | 83 | { |
| 79 | using namespace vfs; | 84 | using namespace vfs; |
| 80 | 85 | ||
| @@ -90,14 +95,14 @@ getModuleFromSource(StringRef Name, StringRef Content) | |||
| 90 | OverlayFS->pushOverlay(MemFS); | 95 | OverlayFS->pushOverlay(MemFS); |
| 91 | MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content)); | 96 | MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content)); |
| 92 | 97 | ||
| 93 | return getModuleFromSource(Name, OverlayFS); | 98 | return getModuleFromSource(std::move(CFlags), Name, OverlayFS); |
| 94 | } | 99 | } |
| 95 | 100 | ||
| 96 | std::unique_ptr<llvm::Module> | 101 | std::unique_ptr<llvm::Module> |
| 97 | getModuleFromSource(StringRef Path) | 102 | getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path) |
| 98 | { | 103 | { |
| 99 | IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem()); | 104 | IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem()); |
| 100 | return getModuleFromSource(Path, VFS); | 105 | return getModuleFromSource(std::move(CFlags), Path, VFS); |
| 101 | } | 106 | } |
| 102 | 107 | ||
| 103 | } | 108 | } |
