|
@@ -13,10 +13,15 @@
|
|
|
#include "clang/Frontend/CompilerInstance.h"
|
|
|
#include "clang/Frontend/TextDiagnosticPrinter.h"
|
|
|
#include "clang/Tooling/Tooling.h"
|
|
|
+#include "llvm/IR/LegacyPassManager.h"
|
|
|
#include "llvm/IR/Module.h"
|
|
|
#include "llvm/Option/Option.h"
|
|
|
#include "llvm/Support/FileSystem.h"
|
|
|
#include "llvm/Support/ManagedStatic.h"
|
|
|
+#include "llvm/Support/TargetRegistry.h"
|
|
|
+#include "llvm/Support/TargetSelect.h"
|
|
|
+#include "llvm/Target/TargetMachine.h"
|
|
|
+#include "llvm/Target/TargetOptions.h"
|
|
|
#include <memory>
|
|
|
|
|
|
#include "clang.h"
|
|
@@ -105,12 +110,52 @@ getModuleFromSource(llvm::opt::ArgStringList CFlags, StringRef Path)
|
|
|
return getModuleFromSource(std::move(CFlags), Path, VFS);
|
|
|
}
|
|
|
|
|
|
+std::unique_ptr<llvm::SmallVectorImpl<char>>
|
|
|
+getBPFObjectFromModule(llvm::Module *Module)
|
|
|
+{
|
|
|
+ using namespace llvm;
|
|
|
+
|
|
|
+ std::string TargetTriple("bpf-pc-linux");
|
|
|
+ std::string Error;
|
|
|
+ const Target* Target = TargetRegistry::lookupTarget(TargetTriple, Error);
|
|
|
+ if (!Target) {
|
|
|
+ llvm::errs() << Error;
|
|
|
+ return std::unique_ptr<llvm::SmallVectorImpl<char>>(nullptr);
|
|
|
+ }
|
|
|
+
|
|
|
+ llvm::TargetOptions Opt;
|
|
|
+ TargetMachine *TargetMachine =
|
|
|
+ Target->createTargetMachine(TargetTriple,
|
|
|
+ "generic", "",
|
|
|
+ Opt, Reloc::Static);
|
|
|
+
|
|
|
+ Module->setDataLayout(TargetMachine->createDataLayout());
|
|
|
+ Module->setTargetTriple(TargetTriple);
|
|
|
+
|
|
|
+ std::unique_ptr<SmallVectorImpl<char>> Buffer(new SmallVector<char, 0>());
|
|
|
+ raw_svector_ostream ostream(*Buffer);
|
|
|
+
|
|
|
+ legacy::PassManager PM;
|
|
|
+ if (TargetMachine->addPassesToEmitFile(PM, ostream,
|
|
|
+ TargetMachine::CGFT_ObjectFile)) {
|
|
|
+ llvm::errs() << "TargetMachine can't emit a file of this type\n";
|
|
|
+ return std::unique_ptr<llvm::SmallVectorImpl<char>>(nullptr);;
|
|
|
+ }
|
|
|
+ PM.run(*Module);
|
|
|
+
|
|
|
+ return std::move(Buffer);
|
|
|
+}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
extern "C" {
|
|
|
void perf_clang__init(void)
|
|
|
{
|
|
|
perf::LLVMCtx.reset(new llvm::LLVMContext());
|
|
|
+ LLVMInitializeBPFTargetInfo();
|
|
|
+ LLVMInitializeBPFTarget();
|
|
|
+ LLVMInitializeBPFTargetMC();
|
|
|
+ LLVMInitializeBPFAsmPrinter();
|
|
|
}
|
|
|
|
|
|
void perf_clang__cleanup(void)
|