|
47 | 47 | #include "llvm/Support/MemoryBuffer.h" |
48 | 48 | #include "llvm/Support/Path.h" |
49 | 49 | #include "llvm/Support/Signals.h" |
50 | | -//#include "llvm/Support/StringSaver.h" |
51 | | -//#include "llvm/Support/WithColor.h" |
52 | 50 |
|
53 | 51 | // for raw `write` in the bad-alloc handler |
54 | 52 | #ifdef _MSC_VER |
@@ -79,46 +77,36 @@ static Error writeFile(StringRef Filename, StringRef Data) { |
79 | 77 | return E; |
80 | 78 | return Error::success(); |
81 | 79 | } |
82 | | - |
83 | | -extern "C" bool rustBundleImages(LLVMModuleRef M, StringRef triple, StringRef arch) { |
84 | | - Module *Mptr = unwrap(M); |
| 80 | +#include "llvm/Target/TargetMachine.h" |
| 81 | +extern "C" bool rustBundleImages(LLVMModuleRef M, TargetMachine &TM) { |
| 82 | + //Module *Mptr = unwrap(M); |
85 | 83 | std::string Storage; |
86 | 84 | llvm::raw_string_ostream OS1(Storage); |
87 | | - Mptr->print(OS1, nullptr); |
| 85 | + |
| 86 | + llvm::WriteBitcodeToFile(*unwrap(M), OS1); |
| 87 | + //llvm::WriteBitcodeToFile(*Mptr, OS1); |
88 | 88 | OS1.flush(); |
89 | | - auto MB = llvm::MemoryBuffer::getMemBufferCopy(Storage, "module.ll"); |
| 89 | + auto MB = llvm::MemoryBuffer::getMemBufferCopy(Storage, "module.bc"); |
90 | 90 |
|
91 | 91 | SmallVector<char, 1024> BinaryData; |
92 | 92 | raw_svector_ostream OS(BinaryData); |
93 | 93 | BumpPtrAllocator Alloc; |
94 | 94 | StringSaver Saver(Alloc); |
95 | 95 |
|
96 | 96 | DenseMap<StringRef, StringRef> Args; |
97 | | - //Args["triple"] = "amdgcn-amd-amdhsa"; // required |
98 | | - //Args["arch"] = "gfx90a"; // optional, but from rustc? |
99 | 97 |
|
100 | 98 | { |
101 | 99 | OffloadBinary::OffloadingImage ImageBinary{}; |
102 | | - |
103 | | - |
104 | | - //llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr = |
105 | | - // llvm::MemoryBuffer::getFileOrSTDIN("device.bc"); |
106 | | - //if (std::error_code EC = ObjectOrErr.getError()) |
107 | | - // return false; |
108 | | - |
109 | | - // Clang uses the '.o' suffix for LTO bitcode. |
110 | 100 | ImageBinary.TheImageKind = object::IMG_Bitcode; |
111 | 101 | ImageBinary.Image = std::move(MB); |
112 | | - //ImageBinary.Image = std::move(*ObjectOrErr); |
113 | 102 | ImageBinary.TheOffloadKind = object::OFK_OpenMP; |
114 | | - ImageBinary.StringData["triple"] = triple; |
115 | | - ImageBinary.StringData["arch"] = arch; |
116 | | - //for (const auto &[Key, Value] : Args) { |
117 | | - // ImageBinary.StringData[Key] = Value; |
118 | | - //} |
| 103 | + //ImageBinary.StringData["triple"] = triple; |
| 104 | + //ImageBinary.StringData["arch"] = arch; |
| 105 | + ImageBinary.StringData["triple"] = TM.getTargetTriple().str(); |
| 106 | + ImageBinary.StringData["arch"] = TM.getTargetCPU(); |
119 | 107 | llvm::SmallString<0> Buffer = OffloadBinary::write(ImageBinary); |
120 | 108 | if (Buffer.size() % OffloadBinary::getAlignment() != 0) |
121 | | - // "Offload binary has invalid size alignment"); |
| 109 | + // Offload binary has invalid size alignment |
122 | 110 | return false; |
123 | 111 | OS << Buffer; |
124 | 112 | } |
|
0 commit comments