backports.cpp raw

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