perf clang: Allow passing CFLAGS to builtin clang
authorWang Nan <wangnan0@huawei.com>
Sat, 26 Nov 2016 07:03:36 +0000 (07:03 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 5 Dec 2016 18:51:44 +0000 (15:51 -0300)
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>
tools/perf/util/c++/clang-test.cpp
tools/perf/util/c++/clang.cpp
tools/perf/util/c++/clang.h

index 3da6bfa..0f484fb 100644 (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;
index cf96199..715ca0a 100644 (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);
 }
 
 }
index 90aff01..b4fc2a9 100644 (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