Index: include/llvm/Linker/IRMover.h =================================================================== --- include/llvm/Linker/IRMover.h +++ include/llvm/Linker/IRMover.h @@ -60,7 +60,7 @@ bool hasType(StructType *Ty); }; - IRMover(Module &M); + IRMover(Module &M, bool OnlyNamedTypes = false); typedef std::function ValueAdder; Index: include/llvm/Linker/Linker.h =================================================================== --- include/llvm/Linker/Linker.h +++ include/llvm/Linker/Linker.h @@ -30,9 +30,10 @@ None = 0, OverrideFromSrc = (1 << 0), LinkOnlyNeeded = (1 << 1), + DontLinkUnnamedTypes = (1 << 2), }; - Linker(Module &M); + Linker(Module &M, bool OnlyNamedTypes = false); /// \brief Link \p Src into the composite. /// Index: lib/Linker/IRMover.cpp =================================================================== --- lib/Linker/IRMover.cpp +++ lib/Linker/IRMover.cpp @@ -1411,9 +1411,9 @@ return I == NonOpaqueStructTypes.end() ? false : *I == Ty; } -IRMover::IRMover(Module &M) : Composite(M) { +IRMover::IRMover(Module &M, bool OnlyNamedTypes) : Composite(M) { TypeFinder StructTypes; - StructTypes.run(M, /* OnlyNamed */ false); + StructTypes.run(M, OnlyNamedTypes); for (StructType *Ty : StructTypes) { if (Ty->isOpaque()) IdentifiedStructTypes.addOpaque(Ty); Index: lib/Linker/LinkModules.cpp =================================================================== --- lib/Linker/LinkModules.cpp +++ lib/Linker/LinkModules.cpp @@ -559,7 +559,8 @@ return false; } -Linker::Linker(Module &M) : Mover(M) {} +Linker::Linker(Module &M, bool OnlyNamedTypes) : + Mover(M, OnlyNamedTypes) {} bool Linker::linkInModule( std::unique_ptr Src, unsigned Flags, @@ -581,7 +582,8 @@ bool Linker::linkModules( Module &Dest, std::unique_ptr Src, unsigned Flags, std::function &)> InternalizeCallback) { - Linker L(Dest); + bool OnlyNamedTypes = (Flags & DontLinkUnnamedTypes) != 0; + Linker L(Dest, OnlyNamedTypes); return L.linkInModule(std::move(Src), Flags, std::move(InternalizeCallback)); } Index: tools/llvm-link/llvm-link.cpp =================================================================== --- tools/llvm-link/llvm-link.cpp +++ tools/llvm-link/llvm-link.cpp @@ -97,6 +97,10 @@ DumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden); static cl::opt +NoLinkUnnamedTypes("no-link-unnamed", cl::desc("Don't link unnamed types"), + cl::Hidden); + +static cl::opt SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"), cl::init(false)); @@ -361,6 +365,8 @@ unsigned Flags = Linker::Flags::None; if (OnlyNeeded) Flags |= Linker::Flags::LinkOnlyNeeded; + if (NoLinkUnnamedTypes) + Flags |= Linker::Flags::DontLinkUnnamedTypes; // First add all the regular input files if (!linkFiles(argv[0], Context, L, InputFilenames, Flags))