Commit a9495fe9 authored by Wang Nan's avatar Wang Nan Committed by Arnaldo Carvalho de Melo

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: default avatarWang 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 77dfa84a
...@@ -16,8 +16,9 @@ int test__clang_to_IR(void) ...@@ -16,8 +16,9 @@ int test__clang_to_IR(void)
perf_clang_scope _scope; perf_clang_scope _scope;
std::unique_ptr<llvm::Module> M = std::unique_ptr<llvm::Module> M =
perf::getModuleFromSource("perf-test.c", perf::getModuleFromSource({"-DRESULT=1"},
"int myfunc(void) {return 1;}"); "perf-test.c",
"int myfunc(void) {return RESULT;}");
if (!M) if (!M)
return -1; return -1;
......
...@@ -29,7 +29,8 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx; ...@@ -29,7 +29,8 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx;
using namespace clang; using namespace clang;
static CompilerInvocation * static CompilerInvocation *
createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path,
DiagnosticsEngine& Diags)
{ {
llvm::opt::ArgStringList CCArgs { llvm::opt::ArgStringList CCArgs {
"-cc1", "-cc1",
...@@ -45,6 +46,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) ...@@ -45,6 +46,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
"-Wno-unused-value", "-Wno-unused-value",
"-Wno-pointer-sign", "-Wno-pointer-sign",
"-x", "c"}; "-x", "c"};
CCArgs.append(CFlags.begin(), CFlags.end());
CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs); CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs);
FrontendOptions& Opts = CI->getFrontendOpts(); FrontendOptions& Opts = CI->getFrontendOpts();
...@@ -54,8 +57,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags) ...@@ -54,8 +57,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
} }
static std::unique_ptr<llvm::Module> static std::unique_ptr<llvm::Module>
getModuleFromSource(StringRef Path, getModuleFromSource(llvm::opt::ArgStringList CFlags,
IntrusiveRefCntPtr<vfs::FileSystem> VFS) StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS)
{ {
CompilerInstance Clang; CompilerInstance Clang;
Clang.createDiagnostics(); Clang.createDiagnostics();
...@@ -63,7 +66,8 @@ getModuleFromSource(StringRef Path, ...@@ -63,7 +66,8 @@ getModuleFromSource(StringRef Path,
Clang.setVirtualFileSystem(&*VFS); Clang.setVirtualFileSystem(&*VFS);
IntrusiveRefCntPtr<CompilerInvocation> CI = IntrusiveRefCntPtr<CompilerInvocation> CI =
createCompilerInvocation(Path, Clang.getDiagnostics()); createCompilerInvocation(std::move(CFlags), Path,
Clang.getDiagnostics());
Clang.setInvocation(&*CI); Clang.setInvocation(&*CI);
std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx)); std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
...@@ -74,7 +78,8 @@ getModuleFromSource(StringRef Path, ...@@ -74,7 +78,8 @@ getModuleFromSource(StringRef Path,
} }
std::unique_ptr<llvm::Module> std::unique_ptr<llvm::Module>
getModuleFromSource(StringRef Name, StringRef Content) getModuleFromSource(llvm::opt::ArgStringList CFlags,
StringRef Name, StringRef Content)
{ {
using namespace vfs; using namespace vfs;
...@@ -90,14 +95,14 @@ getModuleFromSource(StringRef Name, StringRef Content) ...@@ -90,14 +95,14 @@ getModuleFromSource(StringRef Name, StringRef Content)
OverlayFS->pushOverlay(MemFS); OverlayFS->pushOverlay(MemFS);
MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content)); MemFS->addFile(Twine(Name), 0, llvm::MemoryBuffer::getMemBuffer(Content));
return getModuleFromSource(Name, OverlayFS); return getModuleFromSource(std::move(CFlags), Name, OverlayFS);
} }
std::unique_ptr<llvm::Module> std::unique_ptr<llvm::Module>
getModuleFromSource(StringRef Path) getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path)
{ {
IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem()); IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem());
return getModuleFromSource(Path, VFS); return getModuleFromSource(std::move(CFlags), Path, VFS);
} }
} }
......
...@@ -4,16 +4,20 @@ ...@@ -4,16 +4,20 @@
#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringRef.h"
#include "llvm/IR/LLVMContext.h" #include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h" #include "llvm/IR/Module.h"
#include "llvm/Option/Option.h"
#include <memory> #include <memory>
namespace perf { namespace perf {
using namespace llvm; using namespace llvm;
std::unique_ptr<Module> std::unique_ptr<Module>
getModuleFromSource(StringRef Name, StringRef Content); getModuleFromSource(opt::ArgStringList CFlags,
StringRef Name, StringRef Content);
std::unique_ptr<Module> std::unique_ptr<Module>
getModuleFromSource(StringRef Path); getModuleFromSource(opt::ArgStringList CFlags,
StringRef Path);
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment