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>
This commit is contained in:
Wang Nan 2016-11-26 07:03:36 +00:00 committed by Arnaldo Carvalho de Melo
parent 77dfa84a84
commit a9495fe9dc
3 changed files with 22 additions and 12 deletions

View File

@ -16,8 +16,9 @@ int test__clang_to_IR(void)
perf_clang_scope _scope;
std::unique_ptr<llvm::Module> M =
perf::getModuleFromSource("perf-test.c",
"int myfunc(void) {return 1;}");
perf::getModuleFromSource({"-DRESULT=1"},
"perf-test.c",
"int myfunc(void) {return RESULT;}");
if (!M)
return -1;

View File

@ -29,7 +29,8 @@ static std::unique_ptr<llvm::LLVMContext> LLVMCtx;
using namespace clang;
static CompilerInvocation *
createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path,
DiagnosticsEngine& Diags)
{
llvm::opt::ArgStringList CCArgs {
"-cc1",
@ -45,6 +46,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
"-Wno-unused-value",
"-Wno-pointer-sign",
"-x", "c"};
CCArgs.append(CFlags.begin(), CFlags.end());
CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs);
FrontendOptions& Opts = CI->getFrontendOpts();
@ -54,8 +57,8 @@ createCompilerInvocation(StringRef& Path, DiagnosticsEngine& Diags)
}
static std::unique_ptr<llvm::Module>
getModuleFromSource(StringRef Path,
IntrusiveRefCntPtr<vfs::FileSystem> VFS)
getModuleFromSource(llvm::opt::ArgStringList CFlags,
StringRef Path, IntrusiveRefCntPtr<vfs::FileSystem> VFS)
{
CompilerInstance Clang;
Clang.createDiagnostics();
@ -63,7 +66,8 @@ getModuleFromSource(StringRef Path,
Clang.setVirtualFileSystem(&*VFS);
IntrusiveRefCntPtr<CompilerInvocation> CI =
createCompilerInvocation(Path, Clang.getDiagnostics());
createCompilerInvocation(std::move(CFlags), Path,
Clang.getDiagnostics());
Clang.setInvocation(&*CI);
std::unique_ptr<CodeGenAction> Act(new EmitLLVMOnlyAction(&*LLVMCtx));
@ -74,7 +78,8 @@ getModuleFromSource(StringRef Path,
}
std::unique_ptr<llvm::Module>
getModuleFromSource(StringRef Name, StringRef Content)
getModuleFromSource(llvm::opt::ArgStringList CFlags,
StringRef Name, StringRef Content)
{
using namespace vfs;
@ -90,14 +95,14 @@ getModuleFromSource(StringRef Name, StringRef Content)
OverlayFS->pushOverlay(MemFS);
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>
getModuleFromSource(StringRef Path)
getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path)
{
IntrusiveRefCntPtr<vfs::FileSystem> VFS(vfs::getRealFileSystem());
return getModuleFromSource(Path, VFS);
return getModuleFromSource(std::move(CFlags), Path, VFS);
}
}

View File

@ -4,16 +4,20 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Option/Option.h"
#include <memory>
namespace perf {
using namespace llvm;
std::unique_ptr<Module>
getModuleFromSource(StringRef Name, StringRef Content);
getModuleFromSource(opt::ArgStringList CFlags,
StringRef Name, StringRef Content);
std::unique_ptr<Module>
getModuleFromSource(StringRef Path);
getModuleFromSource(opt::ArgStringList CFlags,
StringRef Path);
}
#endif