Skip to content

Commit

Permalink
Factor common code it Linker::init.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
espindola committed Nov 17, 2014
1 parent dfeee31 commit c4fe4e9
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 6 deletions.
1 change: 1 addition & 0 deletions include/llvm/Linker/Linker.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
19 changes: 13 additions & 6 deletions lib/Linker/LinkModules.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
}

Expand Down
1 change: 1 addition & 0 deletions unittests/Linker/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
AsmParser
core
linker
)
Expand Down
20 changes: 20 additions & 0 deletions unittests/Linker/LinkModulesTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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

0 comments on commit c4fe4e9

Please sign in to comment.