Update MCLinker to work with LLVM 3.4.

This corresponds to merging upstream MCLinker with the following SHA:
6dcbf36cdb146d6f175ba2f18a9004753cafeaff

Change-Id: I1bc8c2ce4accc563450bc71ee295a6e47a0c0469
diff --git a/unittests/BinTreeTest.cpp b/unittests/BinTreeTest.cpp
index 5d2cd0a..e436752 100644
--- a/unittests/BinTreeTest.cpp
+++ b/unittests/BinTreeTest.cpp
@@ -124,47 +124,46 @@
 
 TEST_F( BinTreeTest, DFSIterator_BasicTraversal)
 {
-  int a = 111;
+  int a = 111, b = 10, c = 9, d = 8, e = 7;
   BinaryTree<int>::iterator pos = m_pTestee->root();
 
   m_pTestee->join<InputTree::Inclusive>(pos,a);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,10);
-  m_pTestee->join<InputTree::Inclusive>(pos,9);
+  m_pTestee->join<InputTree::Positional>(pos,b);
+  m_pTestee->join<InputTree::Inclusive>(pos,c);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,8);
-  m_pTestee->join<InputTree::Inclusive>(pos,7);
+  m_pTestee->join<InputTree::Positional>(pos,d);
+  m_pTestee->join<InputTree::Inclusive>(pos,e);
 
   BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin();
   BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end();
 
   ASSERT_EQ(111, **dfs_it);
   ++dfs_it;
-  ASSERT_EQ(9, **dfs_it);
+  EXPECT_EQ(9, **dfs_it);
   ++dfs_it;
-  ASSERT_EQ(7, **dfs_it);
+  EXPECT_EQ(7, **dfs_it);
   ++dfs_it;
-  ASSERT_EQ(8, **dfs_it);
+  EXPECT_EQ(8, **dfs_it);
   ++dfs_it;
-  ASSERT_EQ(10, **dfs_it);
+  EXPECT_EQ(10, **dfs_it);
   ++dfs_it;
-  ASSERT_TRUE( dfs_it ==  dfs_end);
-  BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
-  BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
+  EXPECT_TRUE( dfs_it ==  dfs_end);
 }
 
 TEST_F( BinTreeTest, DFSIterator_RightMostTree)
 {
+  int a = 0, b = 1, c = 2, d = 3, e = 4;
   BinaryTree<int>::iterator pos = m_pTestee->root();
-  m_pTestee->join<InputTree::Inclusive>(pos,0);
+  m_pTestee->join<InputTree::Inclusive>(pos,a);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,1);
+  m_pTestee->join<InputTree::Positional>(pos,b);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,2);
+  m_pTestee->join<InputTree::Positional>(pos,c);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,3);
+  m_pTestee->join<InputTree::Positional>(pos,d);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,4);
+  m_pTestee->join<InputTree::Positional>(pos,e);
 
   BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin();
   BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end();
@@ -199,16 +198,16 @@
 
 TEST_F( BinTreeTest, BFSIterator_BasicTraversal)
 {
-  int a = 111;
+  int a = 111, b = 10, c = 9, d = 8, e = 7;
   BinaryTree<int>::iterator pos = m_pTestee->root();
 
   m_pTestee->join<InputTree::Inclusive>(pos,a);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,10);
-  m_pTestee->join<InputTree::Inclusive>(pos,9);
+  m_pTestee->join<InputTree::Positional>(pos,b);
+  m_pTestee->join<InputTree::Inclusive>(pos,c);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,8);
-  m_pTestee->join<InputTree::Inclusive>(pos,7);
+  m_pTestee->join<InputTree::Positional>(pos,d);
+  m_pTestee->join<InputTree::Inclusive>(pos,e);
 
   BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
   BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
@@ -230,16 +229,17 @@
 
 TEST_F( BinTreeTest, BFSIterator_RightMostTree)
 {
+  int a = 0, b = 1, c = 2, d = 3, e = 4;
   BinaryTree<int>::iterator pos = m_pTestee->root();
-  m_pTestee->join<InputTree::Inclusive>(pos,0);
+  m_pTestee->join<InputTree::Inclusive>(pos,a);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,1);
+  m_pTestee->join<InputTree::Positional>(pos,b);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,2);
+  m_pTestee->join<InputTree::Positional>(pos,c);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,3);
+  m_pTestee->join<InputTree::Positional>(pos,d);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,4);
+  m_pTestee->join<InputTree::Positional>(pos,e);
 
   BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
   BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
@@ -274,17 +274,18 @@
 
 TEST_F( BinTreeTest, TreeIterator)
 {
+  int a = 0, b = 1, c = 2, d = 3, e = 4, f = 5;
   BinaryTree<int>::iterator pos = m_pTestee->root();
-  m_pTestee->join<InputTree::Inclusive>(pos,0);
+  m_pTestee->join<InputTree::Inclusive>(pos,a);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,1);
+  m_pTestee->join<InputTree::Positional>(pos,b);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Inclusive>(pos,2);
-  m_pTestee->join<InputTree::Positional>(pos,5);
+  m_pTestee->join<InputTree::Inclusive>(pos,c);
+  m_pTestee->join<InputTree::Positional>(pos,f);
   pos.move<InputTree::Inclusive>();
-  m_pTestee->join<InputTree::Positional>(pos,3);
+  m_pTestee->join<InputTree::Positional>(pos,d);
   pos.move<InputTree::Positional>();
-  m_pTestee->join<InputTree::Positional>(pos,4);
+  m_pTestee->join<InputTree::Positional>(pos,e);
 
   BinaryTree<int>::iterator it = m_pTestee->begin();
   BinaryTree<int>::iterator end = m_pTestee->end();
diff --git a/unittests/DirIteratorTest.cpp b/unittests/DirIteratorTest.cpp
index f319172..13472ac 100644
--- a/unittests/DirIteratorTest.cpp
+++ b/unittests/DirIteratorTest.cpp
@@ -6,9 +6,9 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
-#include "mcld/Support/Directory.h"
+#include <mcld/Support/Directory.h>
 #include "DirIteratorTest.h"
-#include "errno.h"
+#include <errno.h>
 
 using namespace mcld;
 using namespace mcld::sys::fs;
diff --git a/unittests/ELFBinaryReaderTest.cpp b/unittests/ELFBinaryReaderTest.cpp
new file mode 100644
index 0000000..7792717
--- /dev/null
+++ b/unittests/ELFBinaryReaderTest.cpp
@@ -0,0 +1,64 @@
+//===- ELFBinaryReaderTest.cpp --------------------------------------------===//
+//
+//                     The MCLinker Project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <mcld/LD/ELFBinaryReader.h>
+#include <mcld/Module.h>
+#include <mcld/LinkerScript.h>
+#include <mcld/LinkerConfig.h>
+#include <mcld/IRBuilder.h>
+#include <mcld/GeneralOptions.h>
+#include <mcld/MC/Input.h>
+
+#include "ELFBinaryReaderTest.h"
+
+using namespace mcld;
+using namespace mcld::test;
+
+
+// Constructor can do set-up work for all test here.
+ELFBinaryReaderTest::ELFBinaryReaderTest()
+{
+}
+
+// Destructor can do clean-up work that doesn't throw exceptions here.
+ELFBinaryReaderTest::~ELFBinaryReaderTest()
+{
+}
+
+// SetUp() will be called immediately before each test.
+void ELFBinaryReaderTest::SetUp()
+{
+}
+
+// TearDown() will be called immediately after each test.
+void ELFBinaryReaderTest::TearDown()
+{
+}
+
+//===----------------------------------------------------------------------===//
+// Testcases
+//===----------------------------------------------------------------------===//
+TEST_F( ELFBinaryReaderTest, is_myformat) {
+  LinkerScript script;
+  Module module("test", script);
+  LinkerConfig config;
+  IRBuilder builder(module, config);
+  ELFBinaryReader *reader = new ELFBinaryReader(builder, config);
+
+  Input input("test.bin");
+
+  bool doContinue = false;
+  config.options().setBinaryInput();
+  ASSERT_TRUE(reader->isMyFormat(input, doContinue));
+
+  config.options().setBinaryInput(false);
+  ASSERT_FALSE(reader->isMyFormat(input, doContinue));
+
+  delete reader;
+}
+
diff --git a/unittests/ELFBinaryReaderTest.h b/unittests/ELFBinaryReaderTest.h
new file mode 100644
index 0000000..a9ea042
--- /dev/null
+++ b/unittests/ELFBinaryReaderTest.h
@@ -0,0 +1,39 @@
+//===- ELFBinaryReaderTest.h ----------------------------------------------===//
+//
+//                     The MCLinker Project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#ifndef MCLD_ELFBINARYREADER_TEST_H
+#define MCLD_ELFBINARYREADER_TEST_H
+
+#include <gtest.h>
+
+namespace mcld {
+class ELFBinaryReader;
+
+namespace test {
+
+class ELFBinaryReaderTest : public ::testing::Test
+{
+public:
+  // Constructor can do set-up work for all test here.
+  ELFBinaryReaderTest();
+
+  // Destructor can do clean-up work that doesn't throw exceptions here.
+  virtual ~ELFBinaryReaderTest();
+
+  // SetUp() will be called immediately before each test.
+  virtual void SetUp();
+
+  // TearDown() will be called immediately after each test.
+  virtual void TearDown();
+};
+
+} // namespace of test
+} // namespace of mcld
+
+#endif
+
diff --git a/unittests/ELFReaderTest.cpp b/unittests/ELFReaderTest.cpp
index ddbc6d5..1ff2a31 100644
--- a/unittests/ELFReaderTest.cpp
+++ b/unittests/ELFReaderTest.cpp
@@ -8,12 +8,14 @@
 //===----------------------------------------------------------------------===//
 #include <cstdio>
 
+#include <llvm/ADT/StringRef.h>
 #include <llvm/Support/ELF.h>
 #include <mcld/IRBuilder.h>
 #include <mcld/TargetOptions.h>
 #include <mcld/LD/ELFReader.h>
-#include <mcld/MC/MCLDInput.h>
+#include <mcld/MC/Input.h>
 #include <mcld/Support/Path.h>
+#include <mcld/Support/MemoryArea.h>
 #include <../lib/Target/X86/X86LDBackend.h>
 #include <../lib/Target/X86/X86GNUInfo.h>
 
@@ -66,11 +68,10 @@
 
   ASSERT_TRUE(m_pInput->hasMemArea());
   size_t hdr_size = m_pELFReader->getELFHeaderSize();
-  MemoryRegion* region = m_pInput->memArea()->request(m_pInput->fileOffset(),
-                                                    hdr_size);
-  uint8_t* ELF_hdr = region->start();
+  llvm::StringRef region = m_pInput->memArea()->request(m_pInput->fileOffset(),
+                                                        hdr_size);
+  const char* ELF_hdr = region.begin();
   bool shdr_result = m_pELFReader->readSectionHeaders(*m_pInput, ELF_hdr);
-  m_pInput->memArea()->release(region);
   ASSERT_TRUE(shdr_result);
 }
 
@@ -109,22 +110,18 @@
   LDSection* strtab_shdr = symtab_shdr->getLink();
   ASSERT_TRUE(NULL!=strtab_shdr);
 
-  MemoryRegion* symtab_region = m_pInput->memArea()->request(
-                         m_pInput->fileOffset() + symtab_shdr->offset(),
-                         symtab_shdr->size());
+  llvm::StringRef symtab_region = m_pInput->memArea()->request(
+      m_pInput->fileOffset() + symtab_shdr->offset(), symtab_shdr->size());
 
-  MemoryRegion* strtab_region = m_pInput->memArea()->request(
-                         m_pInput->fileOffset() + strtab_shdr->offset(),
-                         strtab_shdr->size());
-  char* strtab = reinterpret_cast<char*>(strtab_region->start());
+  llvm::StringRef strtab_region = m_pInput->memArea()->request(
+      m_pInput->fileOffset() + strtab_shdr->offset(), strtab_shdr->size());
+  const char* strtab = strtab_region.begin();
   bool result = m_pELFReader->readSymbols(*m_pInput, *m_pIRBuilder,
-                                          *symtab_region, strtab);
+                                          symtab_region, strtab);
   ASSERT_TRUE(result);
   ASSERT_EQ("hello.c", std::string(m_pInput->context()->getSymbol(1)->name()));
   ASSERT_EQ("puts", std::string(m_pInput->context()->getSymbol(10)->name()));
   ASSERT_TRUE(NULL==m_pInput->context()->getSymbol(11));
-  m_pInput->memArea()->release(symtab_region);
-  m_pInput->memArea()->release(strtab_region);
 
   // -- read relocations
   MemoryArea* mem = m_pInput->memArea();
@@ -134,12 +131,11 @@
 
   uint64_t offset = m_pInput->fileOffset() + (*rs)->offset();
   uint64_t size = (*rs)->size();
-  MemoryRegion* region = mem->request(offset, size);
+  llvm::StringRef region = mem->request(offset, size);
   IRBuilder::CreateRelocData(**rs); /// create relocation data for the header
 
   ASSERT_EQ(llvm::ELF::SHT_RELA, (*rs)->type());
-  ASSERT_TRUE(m_pELFReader->readRela(*m_pInput, **rs, *region));
-  mem->release(region);
+  ASSERT_TRUE(m_pELFReader->readRela(*m_pInput, **rs, region));
 
   const RelocData::RelocationListType &rRelocs =
                           (*rs)->getRelocData()->getRelocationList();
@@ -158,7 +154,8 @@
 }
 
 TEST_F( ELFReaderTest, is_my_format ) {
-  ASSERT_TRUE( m_pELFObjReader->isMyFormat(*m_pInput) );
+  bool doContinue;
+  ASSERT_TRUE( m_pELFObjReader->isMyFormat(*m_pInput, doContinue) );
 }
 
 
diff --git a/unittests/ELFReaderTest.h b/unittests/ELFReaderTest.h
index 58ec470..abe99b1 100644
--- a/unittests/ELFReaderTest.h
+++ b/unittests/ELFReaderTest.h
@@ -19,7 +19,7 @@
 #include <mcld/MC/InputBuilder.h>
 
 namespace mcld {
-  class ELFReader<64, true>;
+  template<> class ELFReader<64, true>;
 } // namespace for mcld
 
 namespace mcldtest
diff --git a/unittests/FragmentRefTest.cpp b/unittests/FragmentRefTest.cpp
index 599289d..881cdb8 100644
--- a/unittests/FragmentRefTest.cpp
+++ b/unittests/FragmentRefTest.cpp
@@ -14,6 +14,7 @@
 #include <mcld/Support/FileHandle.h>
 #include <mcld/Support/MemoryRegion.h>
 #include <mcld/Support/Path.h>
+#include <llvm/ADT/StringRef.h>
 
 using namespace mcld;
 using namespace mcld::sys::fs;
@@ -48,18 +49,18 @@
   MemoryAreaFactory* areaFactory = new MemoryAreaFactory(1);
   MemoryArea* area = areaFactory->produce(path, FileHandle::ReadWrite);
 
-  MemoryRegion* region = area->request(0, 4096);
-  RegionFragment *frag = new RegionFragment(*region);
+  llvm::StringRef region = area->request(0, 4096);
+  RegionFragment *frag = new RegionFragment(region);
   FragmentRef *ref = FragmentRef::Create(*frag, 0x0);
 
-  ASSERT_EQ('H', region->getBuffer()[0]);
-  ASSERT_TRUE(4096 == region->size());
-  ASSERT_EQ('H', frag->getRegion().getBuffer()[0]);
+  ASSERT_EQ('H', region.data()[0]);
+  ASSERT_TRUE(4096 == region.size());
+  ASSERT_EQ('H', frag->getRegion().data()[0]);
   ASSERT_TRUE(4096 == frag->getRegion().size());
   ASSERT_EQ(frag, ref->frag());
-  ASSERT_EQ('H', static_cast<RegionFragment*>(ref->frag())->getRegion().getBuffer()[0]);
+  ASSERT_EQ('H', static_cast<RegionFragment*>(ref->frag())->getRegion().data()[0]);
   ASSERT_TRUE(4096 == static_cast<RegionFragment*>(ref->frag())->getRegion().size());
-  ASSERT_EQ('H', ref->deref()[0]);
+  //ASSERT_EQ('H', ref->deref()[0]);
 
   ASSERT_TRUE(RegionFragment::classof(frag));
 
diff --git a/unittests/GraphTest.cpp b/unittests/GraphTest.cpp
new file mode 100644
index 0000000..38fc0d4
--- /dev/null
+++ b/unittests/GraphTest.cpp
@@ -0,0 +1,340 @@
+//===- GraphTest.cpp ------------------------------------------------------===//
+//
+//                     The MCLinker Project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include "GraphTest.h"
+#include <mcld/ADT/GraphLite/Digraph.h>
+#include <mcld/ADT/GraphLite/ListDigraph.h>
+
+using namespace mcld;
+using namespace mcld::test;
+using namespace mcld::graph;
+
+// Constructor can do set-up work for all test here.
+GraphTest::GraphTest()
+{
+}
+
+// Destructor can do clean-up work that doesn't throw exceptions here.
+GraphTest::~GraphTest()
+{
+}
+
+// SetUp() will be called immediately before each test.
+void GraphTest::SetUp()
+{
+}
+
+// TearDown() will be called immediately after each test.
+void GraphTest::TearDown()
+{
+}
+
+//===----------------------------------------------------------------------===//
+// Testcases
+//===----------------------------------------------------------------------===//
+TEST_F(GraphTest, list_digraph_add_n_erase_nodes_1)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ASSERT_TRUE(NULL == u1->first_in);
+  ASSERT_TRUE(NULL == u1->first_out);
+  ASSERT_TRUE(u2   == u1->prev);
+  ASSERT_TRUE(NULL == u1->next);
+
+  ASSERT_TRUE(NULL == u2->first_in);
+  ASSERT_TRUE(NULL == u2->first_out);
+  ASSERT_TRUE(u3   == u2->prev);
+  ASSERT_TRUE(u1   == u2->next);
+
+  ASSERT_TRUE(NULL == u3->first_in);
+  ASSERT_TRUE(NULL == u3->first_out);
+  ASSERT_TRUE(u2   == u3->next);
+  ASSERT_TRUE(NULL == u3->prev);
+
+  ListDigraph::Node* head = NULL;
+  graph.getHead(head);
+  ASSERT_TRUE(head == u3);
+
+  graph.erase(*u2);
+
+  ASSERT_TRUE(NULL == u1->first_in);
+  ASSERT_TRUE(NULL == u1->first_out);
+  ASSERT_TRUE(u3   == u1->prev);
+  ASSERT_TRUE(NULL == u1->next);
+
+  ASSERT_TRUE(NULL == u3->first_in);
+  ASSERT_TRUE(NULL == u3->first_out);
+  ASSERT_TRUE(u1   == u3->next);
+  ASSERT_TRUE(NULL == u3->prev);
+
+  ASSERT_TRUE(NULL == u2->first_in);
+  ASSERT_TRUE(NULL == u2->first_out);
+  ASSERT_TRUE(NULL == u2->prev);
+  ASSERT_TRUE(NULL == u2->next);
+
+  graph.getHead(head);
+  ASSERT_TRUE(head == u3);
+}
+
+TEST_F(GraphTest, list_digraph_add_n_erase_nodes_2)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ASSERT_TRUE(NULL == u1->first_in);
+  ASSERT_TRUE(NULL == u1->first_out);
+  ASSERT_TRUE(u2   == u1->prev);
+  ASSERT_TRUE(NULL == u1->next);
+
+  ASSERT_TRUE(NULL == u2->first_in);
+  ASSERT_TRUE(NULL == u2->first_out);
+  ASSERT_TRUE(u3   == u2->prev);
+  ASSERT_TRUE(u1   == u2->next);
+
+  ASSERT_TRUE(NULL == u3->first_in);
+  ASSERT_TRUE(NULL == u3->first_out);
+  ASSERT_TRUE(u2   == u3->next);
+  ASSERT_TRUE(NULL == u3->prev);
+
+  ListDigraph::Node* head = NULL;
+  graph.getHead(head);
+  ASSERT_TRUE(head == u3);
+
+  graph.erase(*u1);
+
+  ASSERT_TRUE(NULL == u1->first_in);
+  ASSERT_TRUE(NULL == u1->first_out);
+  ASSERT_TRUE(NULL == u1->prev);
+  ASSERT_TRUE(NULL == u1->next);
+
+  ASSERT_TRUE(NULL == u2->first_in);
+  ASSERT_TRUE(NULL == u2->first_out);
+  ASSERT_TRUE(u3   == u2->prev);
+  ASSERT_TRUE(NULL == u2->next);
+
+  ASSERT_TRUE(NULL == u3->first_in);
+  ASSERT_TRUE(NULL == u3->first_out);
+  ASSERT_TRUE(u2   == u3->next);
+  ASSERT_TRUE(NULL == u3->prev);
+
+  graph.getHead(head);
+  ASSERT_TRUE(head == u3);
+}
+
+TEST_F(GraphTest, list_digraph_add_n_erase_nodes_3)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ASSERT_TRUE(NULL == u1->first_in);
+  ASSERT_TRUE(NULL == u1->first_out);
+  ASSERT_TRUE(u2   == u1->prev);
+  ASSERT_TRUE(NULL == u1->next);
+
+  ASSERT_TRUE(NULL == u2->first_in);
+  ASSERT_TRUE(NULL == u2->first_out);
+  ASSERT_TRUE(u3   == u2->prev);
+  ASSERT_TRUE(u1   == u2->next);
+
+  ASSERT_TRUE(NULL == u3->first_in);
+  ASSERT_TRUE(NULL == u3->first_out);
+  ASSERT_TRUE(u2   == u3->next);
+  ASSERT_TRUE(NULL == u3->prev);
+
+  ListDigraph::Node* head = NULL;
+  graph.getHead(head);
+  ASSERT_TRUE(head == u3);
+
+  graph.erase(*u3);
+
+  ASSERT_TRUE(NULL == u3->first_in);
+  ASSERT_TRUE(NULL == u3->first_out);
+  ASSERT_TRUE(NULL == u3->prev);
+  ASSERT_TRUE(NULL == u3->next);
+
+  ASSERT_TRUE(NULL == u1->first_in);
+  ASSERT_TRUE(NULL == u1->first_out);
+  ASSERT_TRUE(u2   == u1->prev);
+  ASSERT_TRUE(NULL == u1->next);
+
+  ASSERT_TRUE(NULL == u2->first_in);
+  ASSERT_TRUE(NULL == u2->first_out);
+  ASSERT_TRUE(u1   == u2->next);
+  ASSERT_TRUE(NULL == u2->prev);
+
+  graph.getHead(head);
+  ASSERT_TRUE(head == u2);
+
+}
+
+TEST_F(GraphTest, list_digraph_add_arcs_1)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
+  ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
+  ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
+
+  ASSERT_TRUE(u1 == a1->source && u2 == a1->target);
+  ASSERT_TRUE(u2 == a2->source && u3 == a2->target);
+  ASSERT_TRUE(u3 == a3->source && u1 == a3->target);
+
+  ASSERT_TRUE(u1->first_in == a3 && u1->first_out == a1);
+  ASSERT_TRUE(u2->first_in == a1 && u2->first_out == a2);
+  ASSERT_TRUE(u3->first_in == a2 && u3->first_out == a3);
+}
+
+TEST_F(GraphTest, list_digraph_add_arcs_2)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ListDigraph::Arc* a1 = graph.addArc(*u1, *u1);
+  ListDigraph::Arc* a2 = graph.addArc(*u1, *u2);
+  ListDigraph::Arc* a3 = graph.addArc(*u1, *u3);
+
+  ASSERT_TRUE(u1 == a1->source && u1 == a1->target);
+  ASSERT_TRUE(u1 == a2->source && u2 == a2->target);
+  ASSERT_TRUE(u1 == a3->source && u3 == a3->target);
+
+  ASSERT_TRUE(u1->first_in == a1 && u1->first_out == a3);
+  ASSERT_TRUE(u2->first_in == a2 && u2->first_out == NULL);
+  ASSERT_TRUE(u3->first_in == a3 && u3->first_out == NULL);
+}
+
+TEST_F(GraphTest, list_digraph_add_n_erase_arcs_1)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
+  ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
+  ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
+
+  graph.erase(*a2);
+  
+  ASSERT_TRUE(u1 == a1->source && u2 == a1->target);
+  ASSERT_TRUE(u3 == a3->source && u1 == a3->target);
+
+  // remove from the fan-out list
+  ASSERT_TRUE(u2->first_in == a1 && u2->first_out == NULL);
+
+  // remove from the fan-in list
+  ASSERT_TRUE(u3->first_in == NULL && u3->first_out == a3);
+
+  // put into free list
+  ASSERT_TRUE(NULL == a2->next_in);
+}
+
+
+TEST_F(GraphTest, list_digraph_add_n_erase_arcs_2)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
+  ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
+  ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
+
+  graph.erase(*a1);
+  
+  ASSERT_TRUE(u2 == a2->source && u3 == a2->target);
+  ASSERT_TRUE(u3 == a3->source && u1 == a3->target);
+
+  // remove from the fan-out list
+  ASSERT_TRUE(u1->first_in == a3 && u1->first_out == NULL);
+
+  // remove from the fan-in list
+  ASSERT_TRUE(u2->first_in == NULL && u2->first_out == a2);
+
+  // put into free list
+  ASSERT_TRUE(NULL == a1->next_in);
+}
+
+TEST_F(GraphTest, list_digraph_add_n_erase_arcs_3)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
+  ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
+  ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
+
+  graph.erase(*a3);
+  
+  ASSERT_TRUE(u1 == a1->source && u2 == a1->target);
+  ASSERT_TRUE(u2 == a2->source && u3 == a2->target);
+
+  // remove from the fan-out list
+  ASSERT_TRUE(u1->first_in == NULL && u1->first_out == a1);
+
+  // remove from the fan-in list
+  ASSERT_TRUE(u3->first_in == a2 && u3->first_out == NULL);
+
+  // put into free list
+  ASSERT_TRUE(NULL == a3->next_in);
+}
+
+TEST_F(GraphTest, list_digraph_add_n_erase_arcs_4)
+{
+  ListDigraph graph;
+
+  ListDigraph::Node* u1 = graph.addNode();
+  ListDigraph::Node* u2 = graph.addNode();
+  ListDigraph::Node* u3 = graph.addNode();
+
+  ListDigraph::Arc* a1 = graph.addArc(*u1, *u1);
+  graph.addArc(*u1, *u2);
+  graph.addArc(*u1, *u3);
+
+  graph.erase(*u1);
+
+  ASSERT_TRUE(u2->first_in == NULL);
+  ASSERT_TRUE(u3->first_in == NULL);
+  ASSERT_TRUE(a1->next_in == NULL);
+
+}
+
+TEST_F(GraphTest, api_test)
+{
+  Digraph graph;
+
+  Digraph::Node node = graph.addNode();
+  graph.addNode();
+  graph.addNode();
+  graph.addNode();
+
+  ASSERT_EQ(4, graph.numOfNodes());
+  ASSERT_EQ(0, graph.numOfArcs());
+}
diff --git a/unittests/GraphTest.h b/unittests/GraphTest.h
new file mode 100644
index 0000000..a71276b
--- /dev/null
+++ b/unittests/GraphTest.h
@@ -0,0 +1,38 @@
+//===- GraphTest.h --------------------------------------------------------===//
+//
+//                     The MCLinker Project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#ifndef MCLD_GRAPH_TEST_H
+#define MCLD_GRAPH_TEST_H
+
+#include <gtest.h>
+
+
+namespace mcld {
+namespace test {
+
+class GraphTest : public ::testing::Test
+{
+public:
+  // Constructor can do set-up work for all test here.
+  GraphTest();
+
+  // Destructor can do clean-up work that doesn't throw exceptions here.
+  virtual ~GraphTest();
+
+  // SetUp() will be called immediately before each test.
+  virtual void SetUp();
+
+  // TearDown() will be called immediately after each test.
+  virtual void TearDown();
+};
+
+} // namespace of test
+} // namespace of mcld
+
+#endif
+
diff --git a/unittests/HashTableTest.cpp b/unittests/HashTableTest.cpp
index 532c307..fe67e95 100644
--- a/unittests/HashTableTest.cpp
+++ b/unittests/HashTableTest.cpp
@@ -8,8 +8,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "HashTableTest.h"
-#include "mcld/ADT/HashEntry.h"
-#include "mcld/ADT/HashTable.h"
+#include <mcld/ADT/HashEntry.h>
+#include <mcld/ADT/HashTable.h>
 #include <cstdlib>
 
 using namespace std;
diff --git a/unittests/LDSymbolTest.cpp b/unittests/LDSymbolTest.cpp
index c414fa0..e0e681d 100644
--- a/unittests/LDSymbolTest.cpp
+++ b/unittests/LDSymbolTest.cpp
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mcld/LD/LDSymbol.h"
+#include <mcld/LD/LDSymbol.h>
 #include "LDSymbolTest.h"
 
 using namespace mcld;
diff --git a/unittests/LinearAllocatorTest.cpp b/unittests/LinearAllocatorTest.cpp
index fea135f..d38684a 100644
--- a/unittests/LinearAllocatorTest.cpp
+++ b/unittests/LinearAllocatorTest.cpp
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 #include "LinearAllocatorTest.h"
-#include "mcld/Support/Allocators.h"
+#include <mcld/Support/Allocators.h>
 
 using namespace mcld;
 using namespace mcldtest;
diff --git a/unittests/LinkerTest.cpp b/unittests/LinkerTest.cpp
index 16c6448..479bbb9 100644
--- a/unittests/LinkerTest.cpp
+++ b/unittests/LinkerTest.cpp
@@ -14,6 +14,7 @@
 #include <mcld/IRBuilder.h>
 #include <mcld/Linker.h>
 #include <mcld/LinkerConfig.h>
+#include <mcld/LinkerScript.h>
 
 #include <mcld/Support/Path.h>
 
@@ -63,7 +64,7 @@
   //   builder.CreateInput("./test.o");
 
   if (linker.link(module, builder))
-    linker.emit("./test.so");
+    linker.emit(module, "./test.so");
 
   Finalize();
 }
@@ -123,7 +124,7 @@
   builder.ReadInput("crtend", crtend);
 
   if (linker.link(module, builder)) {
-    linker.emit("libplasma.so"); ///< -o libplasma.so
+    linker.emit(module, "libplasma.so"); ///< -o libplasma.so
   }
 
   Finalize();
@@ -181,7 +182,7 @@
   builder1.ReadInput("crtend", crtend);
 
   if (linker.link(module1, builder1)) {
-    linker.emit("libplasma.once.so"); ///< -o libplasma.so
+    linker.emit(module1, "libplasma.once.so"); ///< -o libplasma.so
   }
 
   Finalize();
@@ -224,7 +225,7 @@
   builder2.ReadInput("crtend", crtend);
 
   if (linker.link(module2, builder2)) {
-    linker.emit("libplasma.twice.so"); ///< -o libplasma.exe
+    linker.emit(module2, "libplasma.twice.so"); ///< -o libplasma.exe
   }
 
   Finalize();
@@ -278,7 +279,7 @@
   builder1->ReadInput("crtend", crtend);
 
   if (linker.link(module1, *builder1)) {
-    linker.emit("libplasma.once.so"); ///< -o libplasma.so
+    linker.emit(module1, "libplasma.once.so"); ///< -o libplasma.so
   }
 
   // Can not delete builder until emit the output. Dynamic string table
@@ -326,7 +327,7 @@
   builder2->ReadInput("crtend", crtend);
 
   if (linker.link(module2, *builder2)) {
-    linker.emit("libplasma.twice.so"); ///< -o libplasma.exe
+    linker.emit(module2, "libplasma.twice.so"); ///< -o libplasma.exe
   }
 
   delete builder2;
@@ -467,7 +468,7 @@
  builder.AddRelocation(*rel_text, llvm::ELF::R_ARM_PLT32, *z1gv, 0x4);
 
   if (linker.link(module, builder)) {
-    linker.emit("libgotplt.so"); ///< -o libgotplt.so
+    linker.emit(module, "libgotplt.so"); ///< -o libgotplt.so
   }
 
   Finalize();
diff --git a/unittests/MCRegionFragmentTest.cpp b/unittests/MCRegionFragmentTest.cpp
index 842ddf9..7d6c3b9 100644
--- a/unittests/MCRegionFragmentTest.cpp
+++ b/unittests/MCRegionFragmentTest.cpp
@@ -9,9 +9,9 @@
 
 #include "MCRegionFragmentTest.h"
 
-#include "mcld/MC/MCRegionFragment.h"
-#include "mcld/Support/MemoryAreaFactory.h"
-#include "mcld/Support/Path.h"
+#include <mcld/MC/MCRegionFragment.h>
+#include <mcld/Support/MemoryAreaFactory.h>
+#include <mcld/Support/Path.h>
 
 using namespace mcld;
 using namespace mcldtest;
diff --git a/unittests/MemoryAreaTest.cpp b/unittests/MemoryAreaTest.cpp
deleted file mode 100644
index 0499a0d..0000000
--- a/unittests/MemoryAreaTest.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-//===- MemoryAreaTest.cpp -------------------------------------------------===//
-//
-//                     The MCLinker Project
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#include <mcld/Support/FileHandle.h>
-#include <mcld/Support/FileSystem.h>
-#include <mcld/Support/MemoryArea.h>
-#include <mcld/Support/MemoryRegion.h>
-#include <mcld/Support/MemoryAreaFactory.h>
-#include <mcld/Support/Path.h>
-
-#include "MemoryAreaTest.h"
-#include <fcntl.h>
-#include <cstdio>
-
-using namespace mcld;
-using namespace mcld::sys::fs;
-using namespace mcldtest;
-
-
-// Constructor can do set-up work for all test here.
-MemoryAreaTest::MemoryAreaTest()
-{
-}
-
-// Destructor can do clean-up work that doesn't throw exceptions here.
-MemoryAreaTest::~MemoryAreaTest()
-{
-}
-
-// SetUp() will be called immediately before each test.
-void MemoryAreaTest::SetUp()
-{
-}
-
-// TearDown() will be called immediately after each test.
-void MemoryAreaTest::TearDown()
-{
-}
-
-//==========================================================================//
-// Testcases
-//
-TEST_F( MemoryAreaTest, read_by_malloc )
-{
-	Path path(TOPDIR);
-	path.append("unittests/test3.txt");
-
-	MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1);
-	MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly);
-	MemoryRegion* region = area->request(3, 2);
-	ASSERT_EQ('L', region->getBuffer()[0]);
-	ASSERT_EQ('O', region->getBuffer()[1]);
-	area->release(region);
-	AreaFactory->destruct(area);
-	//delete AreaFactory;;
-}
-
-TEST_F( MemoryAreaTest, write_by_malloc )
-{
-	Path path(TOPDIR);
-	path.append("unittests/test2.txt");
-	MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1);
-	MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly);
-        ASSERT_TRUE(area->handler()->isOpened());
-        ASSERT_TRUE(area->handler()->isGood());
-	MemoryRegion* region = area->request(3, 4);
-	region->getBuffer()[0] = 'L';
-	region->getBuffer()[1] = 'i';
-	region->getBuffer()[2] = 'n';
-	region->getBuffer()[3] = 'k';
-	area->release(region);
-	area->clear();
-	area->handler()->close();
-
-        area->handler()->open(path, FileHandle::ReadOnly);
-        ASSERT_TRUE(area->handler()->isOpened());
-        ASSERT_TRUE(area->handler()->isGood());
-        region = area->request(5, 2);
-        ASSERT_EQ('n', region->getBuffer()[0]);
-        ASSERT_EQ('k', region->getBuffer()[1]);
-	area->release(region);
-	AreaFactory->destruct(area);
-	//delete AreaFactory;;
-}
-
-TEST_F( MemoryAreaTest, read_one_page )
-{
-        Path path(TOPDIR) ;
-	path.append("unittests/test3.txt") ;
-	MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ;
-	MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly) ;
-	ASSERT_TRUE(area->handler()->isOpened()) ;
-	ASSERT_TRUE(area->handler()->isGood()) ;
-	MemoryRegion* region = area->request(0, 4096);
-	ASSERT_EQ('H', region->getBuffer()[0]);
-	ASSERT_EQ('E', region->getBuffer()[1]);
-	area->release(region);
-	AreaFactory->destruct(area);
-	//delete AreaFactory; ;
-}
-
-TEST_F( MemoryAreaTest, write_one_page )
-{
-        Path path(TOPDIR) ;
-	path.append("unittests/test2.txt") ;
-        MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ;
-	MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadWrite);
-	ASSERT_TRUE(area->handler()->isOpened()) ;
-	ASSERT_TRUE(area->handler()->isGood()) ;
-	MemoryRegion* region = area->request(0, 4096) ;
-	region->getBuffer()[4000] = 'K' ;
-	region->getBuffer()[4001] = 'R' ;
-	ASSERT_EQ('K', region->getBuffer()[4000]);
-	ASSERT_EQ('R', region->getBuffer()[4001]);
-	area->release(region);
-	area->clear() ;
-	area->handler()->close();
-
-	area->handler()->open(path, FileHandle::ReadOnly);
-	region = area->request(4000, 4);
-	ASSERT_EQ('K', region->getBuffer()[0]);
-	ASSERT_EQ('R', region->getBuffer()[1]);
-	region->getBuffer()[0] = 'O' ;
-	region->getBuffer()[1] = 'H' ;
-        area->clear() ;
-	AreaFactory->destruct(area);
-	//delete AreaFactory; ;
-}
-
-TEST_F( MemoryAreaTest, write_sync )
-{
-        Path path(TOPDIR) ;
-	path.append("unittests/test2.txt") ;
-	MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ;
-	MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadWrite) ;
-	ASSERT_TRUE(area->handler()->isOpened()) ;
-	ASSERT_TRUE(area->handler()->isGood()) ;
-	MemoryRegion* region1 = area->request(0, 4096) ;
-	MemoryRegion* region2 = area->request(512, 1024) ;
-	region1->getBuffer()[1000] = 'L' ;
-	region1->getBuffer()[1001] = 'L' ;
-	region2->getBuffer()[488] = 'V' ;
-	region2->getBuffer()[489] = 'M' ;
-	area->release(region1);
-	area->release(region2);
-	area->clear();
-	area->handler()->close();
-	area->handler()->open(path, FileHandle::ReadWrite);
-	region1 = area->request(0, 1024) ;
-	EXPECT_EQ('V', region1->getBuffer()[1000]) ;
-	EXPECT_EQ('M', region1->getBuffer()[1001]) ;
-	region1->getBuffer()[1000] = '@' ;
-	region1->getBuffer()[1001] = '@' ;
-	area->release(region1);
-	area->clear();
-	AreaFactory->destruct(area);
-	//delete AreaFactory; ;
-}
-
-
diff --git a/unittests/MemoryAreaTest.h b/unittests/MemoryAreaTest.h
deleted file mode 100644
index 86a5da0..0000000
--- a/unittests/MemoryAreaTest.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//===- MemoryAreaTest.h ---------------------------------------------------===//
-//
-//                     The MCLinker Project
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef MEMORYAREA_TEST_H
-#define MEMORYAREA_TEST_H
-
-#include <gtest.h>
-
-namespace mcld
-{
-class MemoryArea;
-
-} // namespace for mcld
-
-namespace mcldtest
-{
-
-/** \class MemoryAreaTest
- *  \brief 
- *
- *  \see MemoryArea 
- */
-class MemoryAreaTest : public ::testing::Test
-{
-public:
-	// Constructor can do set-up work for all test here.
-	MemoryAreaTest();
-
-	// Destructor can do clean-up work that doesn't throw exceptions here.
-	virtual ~MemoryAreaTest();
-
-	// SetUp() will be called immediately before each test.
-	virtual void SetUp();
-
-	// TearDown() will be called immediately after each test.
-	virtual void TearDown();
-
-protected:
-	mcld::MemoryArea* m_pTestee;
-};
-
-} // namespace of mcldtest
-
-#endif
-
diff --git a/unittests/PathTest.cpp b/unittests/PathTest.cpp
index 1a73de2..73e62cc 100644
--- a/unittests/PathTest.cpp
+++ b/unittests/PathTest.cpp
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 #include "PathTest.h"
-#include "mcld/Support/FileSystem.h"
+#include <mcld/Support/FileSystem.h>
 #include <string>
 
 //
diff --git a/unittests/RTLinearAllocatorTest.cpp b/unittests/RTLinearAllocatorTest.cpp
index 7ed5dac..1e07f4a 100644
--- a/unittests/RTLinearAllocatorTest.cpp
+++ b/unittests/RTLinearAllocatorTest.cpp
@@ -6,8 +6,8 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
-#include "mcld/Support/Allocators.h"
-#include <RTLinearAllocatorTest.h>
+#include <mcld/Support/Allocators.h>
+#include "RTLinearAllocatorTest.h"
 
 using namespace mcld;
 using namespace mcldtest;
diff --git a/unittests/StaticResolverTest.cpp b/unittests/StaticResolverTest.cpp
index bd40cd5..eb3accc 100644
--- a/unittests/StaticResolverTest.cpp
+++ b/unittests/StaticResolverTest.cpp
@@ -59,7 +59,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::define_flag == new_sym->info());
   ASSERT_TRUE( mcld::ResolveInfo::define_flag == old_sym->info());
   bool override = true;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_FALSE( override );
 }
@@ -85,7 +85,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::Define    == old_sym->desc());
 
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_FALSE( override );
   ASSERT_TRUE(1 == old_sym->size());
@@ -112,7 +112,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::Define == old_sym->desc());
 
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_FALSE( override );
   ASSERT_TRUE(1 == old_sym->size());
@@ -139,7 +139,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::Undefined ==  old_sym->desc());
 
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_FALSE( override );
   ASSERT_TRUE(1 == old_sym->size());
@@ -161,7 +161,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::global_flag == new_sym->info());
   ASSERT_TRUE( mcld::ResolveInfo::weak_flag == old_sym->info());
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_TRUE( override );
   ASSERT_TRUE(0 == old_sym->size());
@@ -190,7 +190,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::Define == new_sym->desc());
 
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_FALSE( override );
   ASSERT_TRUE(1 == old_sym->size());
@@ -212,7 +212,7 @@
   ASSERT_TRUE( mcld::ResolveInfo::common_flag == new_sym->info());
   ASSERT_TRUE( mcld::ResolveInfo::common_flag == old_sym->info());
   bool override = true;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_FALSE( override );
   ASSERT_TRUE(999 == old_sym->size());
@@ -237,7 +237,7 @@
   ASSERT_TRUE( (ResolveInfo::weak_flag | ResolveInfo::common_flag) == old_sym->info());
 
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_TRUE( override );
   ASSERT_TRUE(999 == old_sym->size());
@@ -261,7 +261,7 @@
   ASSERT_TRUE( ResolveInfo::common_flag == old_sym->info());
 
   bool override = false;
-  bool result = m_pResolver->resolve(*old_sym, *new_sym, override);
+  bool result = m_pResolver->resolve(*old_sym, *new_sym, override, 0x0);
   ASSERT_TRUE(result);
   ASSERT_TRUE( override );
   ASSERT_TRUE(999 == old_sym->size());
diff --git a/unittests/SymbolTableTest.cpp b/unittests/SymbolTableTest.cpp
index 5b665f0..2dc5143 100644
--- a/unittests/SymbolTableTest.cpp
+++ b/unittests/SymbolTableTest.cpp
@@ -6,7 +6,7 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
-#include "mcld/LD/SymbolTable.h"
+#include <mcld/LD/SymbolTable.h>
 #include "SymbolTableTest.h"
 
 using namespace mcld;
diff --git a/unittests/TargetMachineTest.cpp b/unittests/TargetMachineTest.cpp
index 6258906..85950a9 100644
--- a/unittests/TargetMachineTest.cpp
+++ b/unittests/TargetMachineTest.cpp
@@ -6,7 +6,7 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
-#include <TargetMachineTest.h>
+#include "TargetMachineTest.h"
 
 using namespace mcld;
 using namespace mcldTEST;