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