github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/test/link_example/test_llvm_linker.cpp (about)

     1  #include "OrcLazyJIT.h"
     2  #include "llvm/ADT/StringExtras.h"
     3  #include "llvm/ADT/Triple.h"
     4  #include "llvm/Bitcode/BitcodeReader.h"
     5  #include "llvm/CodeGen/CommandFlags.def"
     6  #include "llvm/CodeGen/LinkAllCodegenComponents.h"
     7  #include "llvm/ExecutionEngine/GenericValue.h"
     8  #include "llvm/ExecutionEngine/Interpreter.h"
     9  #include "llvm/ExecutionEngine/JITEventListener.h"
    10  #include "llvm/ExecutionEngine/MCJIT.h"
    11  #include "llvm/ExecutionEngine/ObjectCache.h"
    12  #include "llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h"
    13  #include "llvm/ExecutionEngine/OrcMCJITReplacement.h"
    14  #include "llvm/ExecutionEngine/SectionMemoryManager.h"
    15  #include "llvm/IR/IRBuilder.h"
    16  #include "llvm/IR/LLVMContext.h"
    17  #include "llvm/IR/Module.h"
    18  #include "llvm/IR/Type.h"
    19  #include "llvm/IR/TypeBuilder.h"
    20  #include "llvm/IRReader/IRReader.h"
    21  #include "llvm/Object/Archive.h"
    22  #include "llvm/Object/ObjectFile.h"
    23  #include "llvm/Support/CommandLine.h"
    24  #include "llvm/Support/Debug.h"
    25  #include "llvm/Support/DynamicLibrary.h"
    26  #include "llvm/Support/Format.h"
    27  #include "llvm/Support/ManagedStatic.h"
    28  #include "llvm/Support/MathExtras.h"
    29  #include "llvm/Support/Memory.h"
    30  #include "llvm/Support/MemoryBuffer.h"
    31  #include "llvm/Support/Path.h"
    32  #include "llvm/Support/PluginLoader.h"
    33  #include "llvm/Support/PrettyStackTrace.h"
    34  #include "llvm/Support/Process.h"
    35  #include "llvm/Support/Program.h"
    36  #include "llvm/Support/Signals.h"
    37  #include "llvm/Support/SourceMgr.h"
    38  #include "llvm/Support/TargetSelect.h"
    39  #include "llvm/Support/raw_ostream.h"
    40  #include "llvm/Transforms/Instrumentation.h"
    41  #include <cerrno>
    42  
    43  #ifdef __CYGWIN__
    44  #include <cygwin/version.h>
    45  #if defined(CYGWIN_VERSION_DLL_MAJOR) && CYGWIN_VERSION_DLL_MAJOR < 1007
    46  #define DO_NOTHING_ATEXIT 1
    47  #endif
    48  #endif
    49  
    50  using namespace llvm;
    51  
    52  
    53  LLVM_ATTRIBUTE_NORETURN
    54  static void reportError(SMDiagnostic Err, const char *ProgName) {
    55    Err.print(ProgName, errs());
    56    exit(1);
    57  }
    58  
    59  //===----------------------------------------------------------------------===//
    60  // main Driver function
    61  //
    62  int main(int argc, char **argv, char *const *envp) {
    63    sys::PrintStackTraceOnErrorSignal(argv[0]);
    64    PrettyStackTraceProgram X(argc, argv);
    65  
    66    atexit(llvm_shutdown); // Call llvm_shutdown() on exit.
    67  
    68    // if (argc > 1)
    69    // ExitOnErr.setBanner(std::string(argv[0]) + ": ");
    70  
    71    // If we have a native target, initialize it to ensure it is linked in and
    72    // usable by the JIT.
    73    InitializeNativeTarget();
    74    InitializeNativeTargetAsmPrinter();
    75    // InitializeNativeTargetAsmParser();
    76  
    77    sys::Process::PreventCoreFiles();
    78  
    79    LLVMContext Context;
    80  
    81    // Load the bitcode...
    82    SMDiagnostic Err;
    83    std::string InputFile =
    84        "/home/xuepeng/git/go-nebulas/nbre/test/link_example/foo.bc";
    85    std::string sopath =
    86        "/home/xuepeng/git/go-nebulas/nbre/test/link_example/libtest_bar.so";
    87    llvm::sys::DynamicLibrary::LoadLibraryPermanently(sopath.c_str());
    88    std::unique_ptr<Module> Owner = parseIRFile(InputFile, Err, Context);
    89    Module *Mod = Owner.get();
    90    if (!Mod)
    91      reportError(Err, argv[0]);
    92  
    93    std::vector<std::unique_ptr<Module>> Ms;
    94    Ms.push_back(std::move(Owner));
    95    // for (auto &ExtraMod : ExtraModules) {
    96    // Ms.push_back(parseIRFile(ExtraMod, Err, Context));
    97    // if (!Ms.back())
    98    // reportError(Err, argv[0]);
    99    //}
   100    std::vector<std::string> Args;
   101    Args.push_back(InputFile);
   102    // for (auto &Arg : InputArgv)
   103    // Args.push_back(Arg);
   104    return runOrcLazyJIT(std::move(Ms), Args);
   105  }