15#include "mlir/Support/LogicalResult.h"
17#include "llvm/Bitcode/BitcodeReader.h"
18#include "llvm/IR/AutoUpgrade.h"
19#include "llvm/IR/DiagnosticInfo.h"
20#include "llvm/IR/DiagnosticPrinter.h"
21#include "llvm/IR/LLVMContext.h"
22#include "llvm/IR/Module.h"
23#include "llvm/IR/ModuleSummaryIndex.h"
24#include "llvm/IR/Verifier.h"
25#include "llvm/IRReader/IRReader.h"
26#include "llvm/Linker/Linker.h"
27#include "llvm/Object/Archive.h"
28#include "llvm/Support/FileSystem.h"
29#include "llvm/Support/SourceMgr.h"
30#include "llvm/Support/WithColor.h"
31#include "llvm/Transforms/IPO/Internalize.h"
38static std::unique_ptr<Module> loadFile(std::unique_ptr<MemoryBuffer> Buffer,
39 LLVMContext &Context,
bool Verbose,
40 bool MaterializeMetadata =
true) {
43 errs() <<
"Loading '" << Buffer->getBufferIdentifier() <<
"'\n";
44 std::unique_ptr<Module> Result;
45 Result = parseIR(*Buffer, Err, Context);
47 Err.print(
"aie-llvm-Link", errs());
51 if (MaterializeMetadata) {
54 if (Result->materializeMetadata()) {
55 Err.print(
"aie-llvm-link", errs());
58 UpgradeDebugInfo(*Result);
64static mlir::LogicalResult linkFiles(
const std::vector<std::string> &Files,
65 LLVMContext &Context, Linker &L,
66 unsigned Flags,
bool DisableDITypeMap,
67 bool NoVerify,
bool Internalize,
70 unsigned ApplicableFlags = Flags & Linker::Flags::OverrideFromSrc;
72 bool InternalizeLinkedSymbols =
false;
73 for (
const auto &File : Files) {
74 std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBufferCopy(File);
76 std::unique_ptr<Module> maybeModule =
77 loadFile(std::move(Buffer), Context, Verbose);
79 WithColor::error() <<
" loading file '" << File <<
"'\n";
80 return mlir::failure();
86 if (DisableDITypeMap && !NoVerify && verifyModule(*maybeModule, &errs())) {
87 WithColor::error() <<
"input module is broken!\n";
88 return mlir::failure();
92 errs() <<
"Linking in '" << File <<
"'\n";
95 if (InternalizeLinkedSymbols)
97 std::move(maybeModule), ApplicableFlags,
98 [](Module &M,
const StringSet<> &GVS) {
99 internalizeModule(M, [&GVS](
const GlobalValue &GV) {
100 return !GV.hasName() || (GVS.count(GV.getName()) == 0);
104 Err = L.linkInModule(std::move(maybeModule), ApplicableFlags);
107 errs() <<
"couldn't link.\n";
108 return mlir::failure();
112 InternalizeLinkedSymbols = Internalize;
115 ApplicableFlags = Flags;
118 return mlir::success();
122 llvm::raw_ostream &output,
const std::vector<std::string> &Files,
123 bool DisableDITypeMap,
bool NoVerify,
bool Internalize,
bool OnlyNeeded,
124 bool PreserveAssemblyUseListOrder,
bool Verbose) {
127 if (!DisableDITypeMap)
128 Context.enableDebugTypeODRUniquing();
130 auto Composite = std::make_unique<Module>(
"aie-llvm-link", Context);
131 Linker L(*Composite);
133 unsigned Flags = Linker::Flags::None;
135 Flags |= Linker::Flags::LinkOnlyNeeded;
138 if (failed(linkFiles(Files, Context, L, Flags, DisableDITypeMap, NoVerify,
139 Internalize, Verbose)))
140 return mlir::failure();
142 Composite->print(output,
nullptr, PreserveAssemblyUseListOrder);
143 return mlir::success();
mlir::LogicalResult AIELLVMLink(llvm::raw_ostream &output, const std::vector< std::string > &Files, bool DisableDITypeMap=false, bool NoVerify=false, bool Internalize=false, bool OnlyNeeded=false, bool PreserveAssemblyUseListOrder=false, bool Verbose=false)