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