Factor common code it Linker::init.

The TypeFinder was not being used in one of the constructors.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222172 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-11-17 20:51:01 +00:00
parent dfeee31cac
commit c4fe4e9681
4 changed files with 35 additions and 6 deletions

View File

@ -45,6 +45,7 @@ class Linker {
static bool LinkModules(Module *Dest, Module *Src);
private:
void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
Module *Composite;
SmallPtrSet<StructType*, 32> IdentifiedStructTypes;
DiagnosticHandlerFunction DiagnosticHandler;

View File

@ -1594,18 +1594,25 @@ bool ModuleLinker::run() {
return false;
}
Linker::Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler)
: Composite(M), DiagnosticHandler(DiagnosticHandler) {}
void Linker::init(Module *M, DiagnosticHandlerFunction DiagnosticHandler) {
this->Composite = M;
this->DiagnosticHandler = DiagnosticHandler;
Linker::Linker(Module *M)
: Composite(M), DiagnosticHandler([this](const DiagnosticInfo &DI) {
Composite->getContext().diagnose(DI);
}) {
TypeFinder StructTypes;
StructTypes.run(*M, true);
IdentifiedStructTypes.insert(StructTypes.begin(), StructTypes.end());
}
Linker::Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler) {
init(M, DiagnosticHandler);
}
Linker::Linker(Module *M) {
init(M, [this](const DiagnosticInfo &DI) {
Composite->getContext().diagnose(DI);
});
}
Linker::~Linker() {
}

View File

@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
AsmParser
core
linker
)

View File

@ -7,12 +7,14 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/AsmParser/Parser.h"
#include "llvm/Linker/Linker.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/SourceMgr.h"
#include "gtest/gtest.h"
using namespace llvm;
@ -157,4 +159,22 @@ TEST_F(LinkModuleTest, EmptyModule2) {
Linker::LinkModules(InternalM.get(), EmptyM.get());
}
TEST_F(LinkModuleTest, TypeMerge) {
LLVMContext C;
SMDiagnostic Err;
const char *M1Str = "%t = type {i32}\n"
"@t1 = weak global %t zeroinitializer\n";
std::unique_ptr<Module> M1 = parseAssemblyString(M1Str, Err, C);
const char *M2Str = "%t = type {i32}\n"
"@t2 = weak global %t zeroinitializer\n";
std::unique_ptr<Module> M2 = parseAssemblyString(M2Str, Err, C);
Linker::LinkModules(M1.get(), M2.get(), [](const llvm::DiagnosticInfo &){});
EXPECT_EQ(M1->getNamedGlobal("t1")->getType(),
M1->getNamedGlobal("t2")->getType());
}
} // end anonymous namespace