backports.cpp raw

   1  
   2  #include "backports.h"
   3  #include "llvm/IR/Instructions.h"
   4  #if LLVM_VERSION_MAJOR >= 16
   5  #include "llvm/IR/PassManager.h"
   6  #include "llvm/Analysis/LoopAnalysisManager.h"
   7  #include "llvm/Analysis/CGSCCPassManager.h"
   8  #include "llvm/Passes/PassBuilder.h"
   9  #include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h"
  10  #else
  11  #include "llvm/IR/LegacyPassManager.h"
  12  #include "llvm/Transforms/IPO/PassManagerBuilder.h"
  13  #endif
  14  #include "llvm/IR/Module.h"
  15  #include "llvm/Pass.h"
  16  #include "llvm/Support/MemoryBuffer.h"
  17  #include "llvm/Transforms/IPO.h"
  18  #include "llvm-c/DebugInfo.h"
  19  
  20  void LLVMGlobalObjectAddMetadata(LLVMValueRef Global, unsigned KindID, LLVMMetadataRef MD) {
  21    llvm::MDNode *N = MD ? llvm::unwrap<llvm::MDNode>(MD) : nullptr;
  22    llvm::GlobalObject *O = llvm::unwrap<llvm::GlobalObject>(Global);
  23    O->addMetadata(KindID, *N);
  24  }
  25  
  26  // See https://reviews.llvm.org/D119431
  27  LLVMMemoryBufferRef LLVMGoWriteThinLTOBitcodeToMemoryBuffer(LLVMModuleRef M) {
  28    std::string Data;
  29    llvm::raw_string_ostream OS(Data);
  30  #if LLVM_VERSION_MAJOR >= 16
  31    llvm::LoopAnalysisManager LAM;
  32    llvm::FunctionAnalysisManager FAM;
  33    llvm::CGSCCAnalysisManager CGAM;
  34    llvm::ModuleAnalysisManager MAM;
  35    llvm::PassBuilder PB;
  36    PB.registerModuleAnalyses(MAM);
  37    PB.registerCGSCCAnalyses(CGAM);
  38    PB.registerFunctionAnalyses(FAM);
  39    PB.registerLoopAnalyses(LAM);
  40    PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
  41    llvm::ModulePassManager MPM;
  42    MPM.addPass(llvm::ThinLTOBitcodeWriterPass(OS, nullptr));
  43    MPM.run(*llvm::unwrap(M), MAM);
  44  #else
  45    llvm::legacy::PassManager PM;
  46    PM.add(createWriteThinLTOBitcodePass(OS));
  47    PM.run(*llvm::unwrap(M));
  48  #endif
  49    return llvm::wrap(llvm::MemoryBuffer::getMemBufferCopy(OS.str()).release());
  50  }
  51  
  52  void LLVMGoDIBuilderInsertDbgValueRecordAtEnd(
  53      LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
  54      LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block) {
  55  #if LLVM_VERSION_MAJOR >= 19
  56    // Note: this returns a LLVMDbgRecordRef. Previously, InsertValueAtEnd would
  57    // return a Value. But since the type changed, and I'd like to keep the API
  58    // consistent across LLVM versions, I decided to drop the return value.
  59    LLVMDIBuilderInsertDbgValueRecordAtEnd(Builder, Val, VarInfo, Expr, DebugLoc, Block);
  60  #else
  61    // Old llvm.dbg.* API.
  62    LLVMDIBuilderInsertDbgValueAtEnd(Builder, Val, VarInfo, Expr, DebugLoc, Block);
  63  #endif
  64  }
  65