Home | History | Annotate | Download | only in Core
      1 //===- IRBuilder.cpp ------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #include <mcld/IRBuilder.h>
     10 #include <mcld/LinkerScript.h>
     11 #include <mcld/LD/ELFReader.h>
     12 #include <mcld/Object/ObjectBuilder.h>
     13 #include <mcld/LD/SectionData.h>
     14 #include <mcld/LD/EhFrame.h>
     15 #include <mcld/LD/RelocData.h>
     16 #include <mcld/Support/MsgHandling.h>
     17 #include <mcld/Support/MemoryArea.h>
     18 #include <mcld/Support/ELF.h>
     19 #include <mcld/Fragment/FragmentRef.h>
     20 #include <llvm/ADT/StringRef.h>
     21 
     22 using namespace mcld;
     23 
     24 //===----------------------------------------------------------------------===//
     25 // Helper Functions
     26 //===----------------------------------------------------------------------===//
     27 LDFileFormat::Kind GetELFSectionKind(uint32_t pType, const char* pName,
     28                                      uint32_t pFlag)
     29 {
     30   if (pFlag & mcld::ELF::SHF_EXCLUDE)
     31     return LDFileFormat::Exclude;
     32 
     33   if (pFlag & llvm::ELF::SHF_MASKPROC)
     34     return LDFileFormat::Target;
     35 
     36   // name rules
     37   llvm::StringRef name(pName);
     38   if (name.startswith(".debug") ||
     39       name.startswith(".zdebug") ||
     40       name.startswith(".line") ||
     41       name.startswith(".stab"))
     42     return LDFileFormat::Debug;
     43   if (name.startswith(".comment"))
     44     return LDFileFormat::MetaData;
     45   if (name.startswith(".interp") || name.startswith(".dynamic"))
     46     return LDFileFormat::Note;
     47   if (name.startswith(".eh_frame"))
     48     return LDFileFormat::EhFrame;
     49   if (name.startswith(".eh_frame_hdr"))
     50     return LDFileFormat::EhFrameHdr;
     51   if (name.startswith(".gcc_except_table"))
     52     return LDFileFormat::GCCExceptTable;
     53   if (name.startswith(".note.GNU-stack"))
     54     return LDFileFormat::StackNote;
     55   if (name.startswith(".gnu.linkonce"))
     56     return LDFileFormat::LinkOnce;
     57 
     58   // type rules
     59   switch(pType) {
     60   case llvm::ELF::SHT_NULL:
     61     return LDFileFormat::Null;
     62   case llvm::ELF::SHT_INIT_ARRAY:
     63   case llvm::ELF::SHT_FINI_ARRAY:
     64   case llvm::ELF::SHT_PREINIT_ARRAY:
     65   case llvm::ELF::SHT_PROGBITS: {
     66     if ((pFlag & llvm::ELF::SHF_EXECINSTR) != 0)
     67       return LDFileFormat::TEXT;
     68     else
     69       return LDFileFormat::DATA;
     70   }
     71   case llvm::ELF::SHT_SYMTAB:
     72   case llvm::ELF::SHT_DYNSYM:
     73   case llvm::ELF::SHT_STRTAB:
     74   case llvm::ELF::SHT_HASH:
     75   case llvm::ELF::SHT_DYNAMIC:
     76   case llvm::ELF::SHT_SYMTAB_SHNDX:
     77     return LDFileFormat::NamePool;
     78   case llvm::ELF::SHT_RELA:
     79   case llvm::ELF::SHT_REL:
     80     return LDFileFormat::Relocation;
     81   case llvm::ELF::SHT_NOBITS:
     82     return LDFileFormat::BSS;
     83   case llvm::ELF::SHT_NOTE:
     84     return LDFileFormat::Note;
     85   case llvm::ELF::SHT_GROUP:
     86     return LDFileFormat::Group;
     87   case llvm::ELF::SHT_GNU_versym:
     88   case llvm::ELF::SHT_GNU_verdef:
     89   case llvm::ELF::SHT_GNU_verneed:
     90     return LDFileFormat::Version;
     91   case llvm::ELF::SHT_SHLIB:
     92     return LDFileFormat::Target;
     93   default:
     94     if ((pType >= llvm::ELF::SHT_LOPROC && pType <= llvm::ELF::SHT_HIPROC) ||
     95         (pType >= llvm::ELF::SHT_LOOS && pType <= llvm::ELF::SHT_HIOS) ||
     96         (pType >= llvm::ELF::SHT_LOUSER && pType <= llvm::ELF::SHT_HIUSER))
     97       return LDFileFormat::Target;
     98     fatal(diag::err_unsupported_section) << pName << pType;
     99   }
    100   return LDFileFormat::MetaData;
    101 }
    102 
    103 //===----------------------------------------------------------------------===//
    104 // IRBuilder
    105 //===----------------------------------------------------------------------===//
    106 IRBuilder::IRBuilder(Module& pModule, const LinkerConfig& pConfig)
    107   : m_Module(pModule), m_Config(pConfig), m_InputBuilder(pConfig) {
    108   m_InputBuilder.setCurrentTree(m_Module.getInputTree());
    109 
    110   // FIXME: where to set up Relocation?
    111   Relocation::SetUp(m_Config);
    112 }
    113 
    114 IRBuilder::~IRBuilder()
    115 {
    116 }
    117 
    118 /// CreateInput - To create an input file and append it to the input tree.
    119 Input* IRBuilder::CreateInput(const std::string& pName,
    120                               const sys::fs::Path& pPath, Input::Type pType)
    121 {
    122   if (Input::Unknown == pType)
    123     return ReadInput(pName, pPath);
    124 
    125   m_InputBuilder.createNode<InputTree::Positional>(pName, pPath, pType);
    126   Input* input = *m_InputBuilder.getCurrentNode();
    127 
    128   if (!input->hasContext())
    129     m_InputBuilder.setContext(*input, false);
    130 
    131   return input;
    132 }
    133 
    134 /// ReadInput - To read an input file and append it to the input tree.
    135 Input*
    136 IRBuilder::ReadInput(const std::string& pName, const sys::fs::Path& pPath)
    137 {
    138   m_InputBuilder.createNode<InputTree::Positional>(pName, pPath, Input::Unknown);
    139   Input* input = *m_InputBuilder.getCurrentNode();
    140 
    141   if (!input->hasContext())
    142     m_InputBuilder.setContext(*input);
    143 
    144   if (!input->hasMemArea())
    145     m_InputBuilder.setMemory(*input, FileHandle::ReadOnly, FileHandle::System);
    146 
    147   return input;
    148 }
    149 
    150 /// ReadInput - To read an input file and append it to the input tree.
    151 Input* IRBuilder::ReadInput(const std::string& pNameSpec)
    152 {
    153   const sys::fs::Path* path = NULL;
    154   // find out the real path of the namespec.
    155   if (m_InputBuilder.getConstraint().isSharedSystem()) {
    156     // In the system with shared object support, we can find both archive
    157     // and shared object.
    158 
    159     if (m_InputBuilder.getAttributes().isStatic()) {
    160       // with --static, we must search an archive.
    161       path = m_Module.getScript().directories().find(pNameSpec, Input::Archive);
    162     }
    163     else {
    164       // otherwise, with --Bdynamic, we can find either an archive or a
    165       // shared object.
    166       path = m_Module.getScript().directories().find(pNameSpec, Input::DynObj);
    167     }
    168   }
    169   else {
    170     // In the system without shared object support, we only look for an archive
    171     path = m_Module.getScript().directories().find(pNameSpec, Input::Archive);
    172   }
    173 
    174   if (NULL == path) {
    175     fatal(diag::err_cannot_find_namespec) << pNameSpec;
    176     return NULL;
    177   }
    178 
    179   m_InputBuilder.createNode<InputTree::Positional>(pNameSpec, *path);
    180   Input* input = *m_InputBuilder.getCurrentNode();
    181 
    182   if (!input->hasContext())
    183     m_InputBuilder.setContext(*input);
    184 
    185   if (!input->hasMemArea())
    186     m_InputBuilder.setMemory(*input, FileHandle::ReadOnly, FileHandle::System);
    187 
    188   return input;
    189 }
    190 
    191 /// ReadInput - To read an input file and append it to the input tree.
    192 Input* IRBuilder::ReadInput(FileHandle& pFileHandle)
    193 {
    194   m_InputBuilder.createNode<InputTree::Positional>("file handler",
    195                                                    pFileHandle.path());
    196 
    197   Input* input = *m_InputBuilder.getCurrentNode();
    198   if (pFileHandle.path().empty()) {
    199     m_InputBuilder.setContext(*input, false);
    200     m_InputBuilder.setMemory(*input, pFileHandle.handler(), FileHandle::ReadOnly);
    201   }
    202   else {
    203     m_InputBuilder.setContext(*input, true);
    204     m_InputBuilder.setMemory(*input, FileHandle::ReadOnly, FileHandle::System);
    205   }
    206 
    207   return input;
    208 }
    209 
    210 /// ReadInput - To read an input file and append it to the input tree.
    211 Input* IRBuilder::ReadInput(const std::string& pName, void* pRawMemory, size_t pSize)
    212 {
    213   m_InputBuilder.createNode<InputTree::Positional>(pName, "NAN");
    214   Input* input = *m_InputBuilder.getCurrentNode();
    215   m_InputBuilder.setContext(*input, false);
    216   m_InputBuilder.setMemory(*input, pRawMemory, pSize);
    217   return input;
    218 }
    219 
    220 bool IRBuilder::StartGroup()
    221 {
    222   if (m_InputBuilder.isInGroup()) {
    223     fatal(diag::fatal_forbid_nest_group);
    224     return false;
    225   }
    226   m_InputBuilder.enterGroup();
    227   return true;
    228 }
    229 
    230 bool IRBuilder::EndGroup()
    231 {
    232   m_InputBuilder.exitGroup();
    233   return true;
    234 }
    235 
    236 void IRBuilder::WholeArchive()
    237 {
    238   m_InputBuilder.getAttributes().setWholeArchive();
    239 }
    240 
    241 void IRBuilder::NoWholeArchive()
    242 {
    243   m_InputBuilder.getAttributes().unsetWholeArchive();
    244 }
    245 
    246 void IRBuilder::AsNeeded()
    247 {
    248   m_InputBuilder.getAttributes().setAsNeeded();
    249 }
    250 
    251 void IRBuilder::NoAsNeeded()
    252 {
    253   m_InputBuilder.getAttributes().unsetAsNeeded();
    254 }
    255 
    256 void IRBuilder::CopyDTNeeded()
    257 {
    258   m_InputBuilder.getAttributes().setAddNeeded();
    259 }
    260 
    261 void IRBuilder::NoCopyDTNeeded()
    262 {
    263   m_InputBuilder.getAttributes().unsetAddNeeded();
    264 }
    265 
    266 void IRBuilder::AgainstShared()
    267 {
    268   m_InputBuilder.getAttributes().setDynamic();
    269 }
    270 
    271 void IRBuilder::AgainstStatic()
    272 {
    273   m_InputBuilder.getAttributes().setStatic();
    274 }
    275 
    276 LDSection* IRBuilder::CreateELFHeader(Input& pInput,
    277                                       const std::string& pName,
    278                                       uint32_t pType,
    279                                       uint32_t pFlag,
    280                                       uint32_t pAlign)
    281 {
    282   // Create section header
    283   LDFileFormat::Kind kind = GetELFSectionKind(pType, pName.c_str(), pFlag);
    284   LDSection* header = LDSection::Create(pName, kind, pType, pFlag);
    285   header->setAlign(pAlign);
    286 
    287   // Append section header in input
    288   pInput.context()->appendSection(*header);
    289   return header;
    290 }
    291 
    292 /// CreateSectionData - To create a section data for given pSection.
    293 SectionData* IRBuilder::CreateSectionData(LDSection& pSection)
    294 {
    295   assert(!pSection.hasSectionData() && "pSection already has section data.");
    296 
    297   SectionData* sect_data = SectionData::Create(pSection);
    298   pSection.setSectionData(sect_data);
    299   return sect_data;
    300 }
    301 
    302 /// CreateRelocData - To create a relocation data for given pSection.
    303 RelocData* IRBuilder::CreateRelocData(LDSection &pSection)
    304 {
    305   assert(!pSection.hasRelocData() && "pSection already has relocation data.");
    306 
    307   RelocData* reloc_data = RelocData::Create(pSection);
    308   pSection.setRelocData(reloc_data);
    309   return reloc_data;
    310 }
    311 
    312 /// CreateEhFrame - To create a eh_frame for given pSection
    313 EhFrame* IRBuilder::CreateEhFrame(LDSection& pSection)
    314 {
    315   assert(!pSection.hasEhFrame() && "pSection already has eh_frame.");
    316 
    317   EhFrame* eh_frame = EhFrame::Create(pSection);
    318   pSection.setEhFrame(eh_frame);
    319   return eh_frame;
    320 }
    321 
    322 /// CreateBSS - To create a bss section for given pSection
    323 SectionData* IRBuilder::CreateBSS(LDSection& pSection)
    324 {
    325   assert(!pSection.hasSectionData() && "pSection already has section data.");
    326   assert((pSection.kind() == LDFileFormat::BSS) && "pSection is not a BSS section.");
    327 
    328   SectionData* sect_data = SectionData::Create(pSection);
    329   pSection.setSectionData(sect_data);
    330 
    331                                    /*  value, valsize, size*/
    332   FillFragment* frag = new FillFragment(0x0, 1, pSection.size());
    333 
    334   ObjectBuilder::AppendFragment(*frag, *sect_data);
    335   return sect_data;
    336 }
    337 
    338 /// CreateRegion - To create a region fragment in the input file.
    339 Fragment* IRBuilder::CreateRegion(Input& pInput, size_t pOffset, size_t pLength)
    340 {
    341   if (!pInput.hasMemArea()) {
    342     fatal(diag::fatal_cannot_read_input) << pInput.path();
    343     return NULL;
    344   }
    345 
    346   if (0 == pLength)
    347     return new FillFragment(0x0, 0, 0);
    348 
    349   llvm::StringRef region = pInput.memArea()->request(pOffset, pLength);
    350   return new RegionFragment(region);
    351 }
    352 
    353 /// CreateRegion - To create a region fragment wrapping the given memory
    354 Fragment* IRBuilder::CreateRegion(void* pMemory, size_t pLength)
    355 {
    356   if (0 == pLength)
    357     return new FillFragment(0x0, 0, 0);
    358 
    359   llvm::StringRef region(reinterpret_cast<const char*>(pMemory), pLength);
    360   return new RegionFragment(region);
    361 }
    362 
    363 /// AppendFragment - To append pFrag to the given SectionData pSD
    364 uint64_t IRBuilder::AppendFragment(Fragment& pFrag, SectionData& pSD)
    365 {
    366   uint64_t size = ObjectBuilder::AppendFragment(pFrag,
    367                                                 pSD,
    368                                                 pSD.getSection().align());
    369   pSD.getSection().setSize(pSD.getSection().size() + size);
    370   return size;
    371 }
    372 
    373 /// AppendRelocation - To append an relocation to the given RelocData pRD.
    374 void IRBuilder::AppendRelocation(Relocation& pRelocation, RelocData& pRD)
    375 {
    376   pRD.append(pRelocation);
    377 }
    378 
    379 /// AppendEhFrame - To append a fragment to EhFrame.
    380 uint64_t IRBuilder::AppendEhFrame(Fragment& pFrag, EhFrame& pEhFrame)
    381 {
    382   uint64_t size = ObjectBuilder::AppendFragment(pFrag,
    383                               *pEhFrame.getSectionData(),
    384                               pEhFrame.getSection().align());
    385   pEhFrame.getSection().setSize(pEhFrame.getSection().size() + size);
    386   return size;
    387 }
    388 
    389 /// AppendEhFrame - To append a FDE to the given EhFrame pEhFram.
    390 uint64_t IRBuilder::AppendEhFrame(EhFrame::FDE& pFDE, EhFrame& pEhFrame)
    391 {
    392   pEhFrame.addFDE(pFDE);
    393   pEhFrame.getSection().setSize(pEhFrame.getSection().size() + pFDE.size());
    394   return pFDE.size();
    395 }
    396 
    397 /// AppendEhFrame - To append a CIE to the given EhFrame pEhFram.
    398 uint64_t IRBuilder::AppendEhFrame(EhFrame::CIE& pCIE, EhFrame& pEhFrame)
    399 {
    400   pEhFrame.addCIE(pCIE);
    401   pEhFrame.getSection().setSize(pEhFrame.getSection().size() + pCIE.size());
    402   return pCIE.size();
    403 }
    404 
    405 /// AddSymbol - To add a symbol in the input file and resolve the symbol
    406 /// immediately
    407 LDSymbol* IRBuilder::AddSymbol(Input& pInput,
    408                                const std::string& pName,
    409                                ResolveInfo::Type pType,
    410                                ResolveInfo::Desc pDesc,
    411                                ResolveInfo::Binding pBind,
    412                                ResolveInfo::SizeType pSize,
    413                                LDSymbol::ValueType pValue,
    414                                LDSection* pSection,
    415                                ResolveInfo::Visibility pVis)
    416 {
    417   // rename symbols
    418   std::string name = pName;
    419   if (!m_Module.getScript().renameMap().empty() &&
    420       ResolveInfo::Undefined == pDesc) {
    421     // If the renameMap is not empty, some symbols should be renamed.
    422     // --wrap and --portable defines the symbol rename map.
    423     const LinkerScript& script = m_Module.getScript();
    424     LinkerScript::SymbolRenameMap::const_iterator renameSym =
    425                                                 script.renameMap().find(pName);
    426     if (script.renameMap().end() != renameSym)
    427       name = renameSym.getEntry()->value();
    428   }
    429 
    430   // Fix up the visibility if object has no export set.
    431   if (pInput.noExport() && (pDesc != ResolveInfo::Undefined)) {
    432     if ((pVis == ResolveInfo::Default) || (pVis == ResolveInfo::Protected)) {
    433       pVis = ResolveInfo::Hidden;
    434     }
    435   }
    436 
    437   switch (pInput.type()) {
    438     case Input::Object: {
    439 
    440       FragmentRef* frag = NULL;
    441       if (NULL == pSection ||
    442           ResolveInfo::Undefined == pDesc ||
    443           ResolveInfo::Common    == pDesc ||
    444           ResolveInfo::Absolute  == pBind ||
    445           LDFileFormat::Ignore   == pSection->kind() ||
    446           LDFileFormat::Group    == pSection->kind())
    447         frag = FragmentRef::Null();
    448       else
    449         frag = FragmentRef::Create(*pSection, pValue);
    450 
    451       LDSymbol* input_sym = addSymbolFromObject(name, pType, pDesc, pBind, pSize, pValue, frag, pVis);
    452       pInput.context()->addSymbol(input_sym);
    453       return input_sym;
    454     }
    455     case Input::DynObj: {
    456       return addSymbolFromDynObj(pInput, name, pType, pDesc, pBind, pSize, pValue, pVis);
    457     }
    458     default: {
    459       return NULL;
    460       break;
    461     }
    462   }
    463   return NULL;
    464 }
    465 
    466 LDSymbol* IRBuilder::addSymbolFromObject(const std::string& pName,
    467                                          ResolveInfo::Type pType,
    468                                          ResolveInfo::Desc pDesc,
    469                                          ResolveInfo::Binding pBinding,
    470                                          ResolveInfo::SizeType pSize,
    471                                          LDSymbol::ValueType pValue,
    472                                          FragmentRef* pFragmentRef,
    473                                          ResolveInfo::Visibility pVisibility)
    474 {
    475   // Step 1. calculate a Resolver::Result
    476   // resolved_result is a triple <resolved_info, existent, override>
    477   Resolver::Result resolved_result;
    478   ResolveInfo old_info; // used for arrange output symbols
    479 
    480   if (pBinding == ResolveInfo::Local) {
    481     // if the symbol is a local symbol, create a LDSymbol for input, but do not
    482     // resolve them.
    483     resolved_result.info     = m_Module.getNamePool().createSymbol(pName,
    484                                                                    false,
    485                                                                    pType,
    486                                                                    pDesc,
    487                                                                    pBinding,
    488                                                                    pSize,
    489                                                                    pVisibility);
    490 
    491     // No matter if there is a symbol with the same name, insert the symbol
    492     // into output symbol table. So, we let the existent false.
    493     resolved_result.existent  = false;
    494     resolved_result.overriden = true;
    495   }
    496   else {
    497     // if the symbol is not local, insert and resolve it immediately
    498     m_Module.getNamePool().insertSymbol(pName, false, pType, pDesc, pBinding,
    499                                         pSize, pValue, pVisibility,
    500                                         &old_info, resolved_result);
    501   }
    502 
    503   // the return ResolveInfo should not NULL
    504   assert(NULL != resolved_result.info);
    505 
    506   /// Step 2. create an input LDSymbol.
    507   // create a LDSymbol for the input file.
    508   LDSymbol* input_sym = LDSymbol::Create(*resolved_result.info);
    509   input_sym->setFragmentRef(pFragmentRef);
    510   input_sym->setValue(pValue);
    511 
    512   // Step 3. Set up corresponding output LDSymbol
    513   LDSymbol* output_sym = resolved_result.info->outSymbol();
    514   bool has_output_sym = (NULL != output_sym);
    515   if (!resolved_result.existent || !has_output_sym) {
    516     // it is a new symbol, the output_sym should be NULL.
    517     assert(NULL == output_sym);
    518 
    519     if (pType == ResolveInfo::Section) {
    520       // if it is a section symbol, its output LDSymbol is the input LDSymbol.
    521       output_sym = input_sym;
    522     }
    523     else {
    524       // if it is a new symbol, create a LDSymbol for the output
    525       output_sym = LDSymbol::Create(*resolved_result.info);
    526     }
    527     resolved_result.info->setSymPtr(output_sym);
    528   }
    529 
    530   if (resolved_result.overriden || !has_output_sym) {
    531     // symbol can be overriden only if it exists.
    532     assert(output_sym != NULL);
    533 
    534     // should override output LDSymbol
    535     output_sym->setFragmentRef(pFragmentRef);
    536     output_sym->setValue(pValue);
    537   }
    538   return input_sym;
    539 }
    540 
    541 LDSymbol* IRBuilder::addSymbolFromDynObj(Input& pInput,
    542                                          const std::string& pName,
    543                                          ResolveInfo::Type pType,
    544                                          ResolveInfo::Desc pDesc,
    545                                          ResolveInfo::Binding pBinding,
    546                                          ResolveInfo::SizeType pSize,
    547                                          LDSymbol::ValueType pValue,
    548                                          ResolveInfo::Visibility pVisibility)
    549 {
    550   // We don't need sections of dynamic objects. So we ignore section symbols.
    551   if (pType == ResolveInfo::Section)
    552     return NULL;
    553 
    554   // ignore symbols with local binding or that have internal or hidden
    555   // visibility
    556   if (pBinding == ResolveInfo::Local ||
    557       pVisibility == ResolveInfo::Internal ||
    558       pVisibility == ResolveInfo::Hidden)
    559     return NULL;
    560 
    561   // A protected symbol in a shared library must be treated as a
    562   // normal symbol when viewed from outside the shared library.
    563   if (pVisibility == ResolveInfo::Protected)
    564     pVisibility = ResolveInfo::Default;
    565 
    566   // insert symbol and resolve it immediately
    567   // resolved_result is a triple <resolved_info, existent, override>
    568   Resolver::Result resolved_result;
    569   m_Module.getNamePool().insertSymbol(pName, true, pType, pDesc,
    570                                       pBinding, pSize, pValue, pVisibility,
    571                                       NULL, resolved_result);
    572 
    573   // the return ResolveInfo should not NULL
    574   assert(NULL != resolved_result.info);
    575 
    576   if (resolved_result.overriden || !resolved_result.existent)
    577     pInput.setNeeded();
    578 
    579   // create a LDSymbol for the input file.
    580   LDSymbol* input_sym = LDSymbol::Create(*resolved_result.info);
    581   input_sym->setFragmentRef(FragmentRef::Null());
    582   input_sym->setValue(pValue);
    583 
    584   // this symbol is seen in a dynamic object, set the InDyn flag
    585   resolved_result.info->setInDyn();
    586 
    587   if (!resolved_result.existent) {
    588     // we get a new symbol, leave it as NULL
    589     resolved_result.info->setSymPtr(NULL);
    590   }
    591   return input_sym;
    592 }
    593 
    594 /// AddRelocation - add a relocation entry
    595 ///
    596 /// All symbols should be read and resolved before calling this function.
    597 Relocation* IRBuilder::AddRelocation(LDSection& pSection,
    598                                      Relocation::Type pType,
    599                                      LDSymbol& pSym,
    600                                      uint32_t pOffset,
    601                                      Relocation::Address pAddend)
    602 {
    603   FragmentRef* frag_ref = FragmentRef::Create(*pSection.getLink(), pOffset);
    604 
    605   Relocation* relocation = Relocation::Create(pType, *frag_ref, pAddend);
    606 
    607   relocation->setSymInfo(pSym.resolveInfo());
    608   pSection.getRelocData()->append(*relocation);
    609 
    610   return relocation;
    611 }
    612 
    613 /// AddSymbol - define an output symbol and override it immediately
    614 template<> LDSymbol*
    615 IRBuilder::AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
    616                                            const llvm::StringRef& pName,
    617                                            ResolveInfo::Type pType,
    618                                            ResolveInfo::Desc pDesc,
    619                                            ResolveInfo::Binding pBinding,
    620                                            ResolveInfo::SizeType pSize,
    621                                            LDSymbol::ValueType pValue,
    622                                            FragmentRef* pFragmentRef,
    623                                            ResolveInfo::Visibility pVisibility)
    624 {
    625   ResolveInfo* info = m_Module.getNamePool().findInfo(pName);
    626   LDSymbol* output_sym = NULL;
    627   if (NULL == info) {
    628     // the symbol is not in the pool, create a new one.
    629     // create a ResolveInfo
    630     Resolver::Result result;
    631     m_Module.getNamePool().insertSymbol(pName, false, pType, pDesc,
    632                                         pBinding, pSize, pValue, pVisibility,
    633                                         NULL, result);
    634     assert(!result.existent);
    635 
    636     // create a output LDSymbol
    637     output_sym = LDSymbol::Create(*result.info);
    638     result.info->setSymPtr(output_sym);
    639 
    640     if (result.info->shouldForceLocal(m_Config))
    641       m_Module.getSymbolTable().forceLocal(*output_sym);
    642     else
    643       m_Module.getSymbolTable().add(*output_sym);
    644   }
    645   else {
    646     // the symbol is already in the pool, override it
    647     ResolveInfo old_info;
    648     old_info.override(*info);
    649 
    650     info->setRegular();
    651     info->setType(pType);
    652     info->setDesc(pDesc);
    653     info->setBinding(pBinding);
    654     info->setVisibility(pVisibility);
    655     info->setIsSymbol(true);
    656     info->setSize(pSize);
    657 
    658     output_sym = info->outSymbol();
    659     if (NULL != output_sym)
    660       m_Module.getSymbolTable().arrange(*output_sym, old_info);
    661     else {
    662       // create a output LDSymbol
    663       output_sym = LDSymbol::Create(*info);
    664       info->setSymPtr(output_sym);
    665 
    666       m_Module.getSymbolTable().add(*output_sym);
    667     }
    668   }
    669 
    670   if (NULL != output_sym) {
    671     output_sym->setFragmentRef(pFragmentRef);
    672     output_sym->setValue(pValue);
    673   }
    674 
    675   return output_sym;
    676 }
    677 
    678 /// AddSymbol - define an output symbol and override it immediately
    679 template<> LDSymbol*
    680 IRBuilder::AddSymbol<IRBuilder::AsReferred, IRBuilder::Unresolve>(
    681                                            const llvm::StringRef& pName,
    682                                            ResolveInfo::Type pType,
    683                                            ResolveInfo::Desc pDesc,
    684                                            ResolveInfo::Binding pBinding,
    685                                            ResolveInfo::SizeType pSize,
    686                                            LDSymbol::ValueType pValue,
    687                                            FragmentRef* pFragmentRef,
    688                                            ResolveInfo::Visibility pVisibility)
    689 {
    690   ResolveInfo* info = m_Module.getNamePool().findInfo(pName);
    691 
    692   if (NULL == info || !(info->isUndef() || info->isDyn())) {
    693     // only undefined symbol and dynamic symbol can make a reference.
    694     return NULL;
    695   }
    696 
    697   // the symbol is already in the pool, override it
    698   ResolveInfo old_info;
    699   old_info.override(*info);
    700 
    701   info->setRegular();
    702   info->setType(pType);
    703   info->setDesc(pDesc);
    704   info->setBinding(pBinding);
    705   info->setVisibility(pVisibility);
    706   info->setIsSymbol(true);
    707   info->setSize(pSize);
    708 
    709   LDSymbol* output_sym = info->outSymbol();
    710   if (NULL != output_sym) {
    711     output_sym->setFragmentRef(pFragmentRef);
    712     output_sym->setValue(pValue);
    713     m_Module.getSymbolTable().arrange(*output_sym, old_info);
    714   }
    715   else {
    716     // create a output LDSymbol
    717     output_sym = LDSymbol::Create(*info);
    718     info->setSymPtr(output_sym);
    719 
    720     m_Module.getSymbolTable().add(*output_sym);
    721   }
    722 
    723   return output_sym;
    724 }
    725 
    726 /// AddSymbol - define an output symbol and resolve it
    727 /// immediately
    728 template<> LDSymbol*
    729 IRBuilder::AddSymbol<IRBuilder::Force, IRBuilder::Resolve>(
    730                                              const llvm::StringRef& pName,
    731                                              ResolveInfo::Type pType,
    732                                              ResolveInfo::Desc pDesc,
    733                                              ResolveInfo::Binding pBinding,
    734                                              ResolveInfo::SizeType pSize,
    735                                              LDSymbol::ValueType pValue,
    736                                              FragmentRef* pFragmentRef,
    737                                              ResolveInfo::Visibility pVisibility)
    738 {
    739   // Result is <info, existent, override>
    740   Resolver::Result result;
    741   ResolveInfo old_info;
    742   m_Module.getNamePool().insertSymbol(pName, false, pType, pDesc, pBinding,
    743                                       pSize, pValue, pVisibility,
    744                                       &old_info, result);
    745 
    746   LDSymbol* output_sym = result.info->outSymbol();
    747   bool has_output_sym = (NULL != output_sym);
    748 
    749   if (!result.existent || !has_output_sym) {
    750     output_sym = LDSymbol::Create(*result.info);
    751     result.info->setSymPtr(output_sym);
    752   }
    753 
    754   if (result.overriden || !has_output_sym) {
    755     output_sym->setFragmentRef(pFragmentRef);
    756     output_sym->setValue(pValue);
    757   }
    758 
    759   // After symbol resolution, the visibility is changed to the most restrict.
    760   // arrange the output position
    761   if (result.info->shouldForceLocal(m_Config))
    762     m_Module.getSymbolTable().forceLocal(*output_sym);
    763   else if (has_output_sym)
    764     m_Module.getSymbolTable().arrange(*output_sym, old_info);
    765   else
    766     m_Module.getSymbolTable().add(*output_sym);
    767 
    768   return output_sym;
    769 }
    770 
    771 /// defineSymbol - define an output symbol and resolve it immediately.
    772 template<> LDSymbol*
    773 IRBuilder::AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>(
    774                                             const llvm::StringRef& pName,
    775                                             ResolveInfo::Type pType,
    776                                             ResolveInfo::Desc pDesc,
    777                                             ResolveInfo::Binding pBinding,
    778                                             ResolveInfo::SizeType pSize,
    779                                             LDSymbol::ValueType pValue,
    780                                             FragmentRef* pFragmentRef,
    781                                             ResolveInfo::Visibility pVisibility)
    782 {
    783   ResolveInfo* info = m_Module.getNamePool().findInfo(pName);
    784 
    785   if (NULL == info || !(info->isUndef() || info->isDyn())) {
    786     // only undefined symbol and dynamic symbol can make a reference.
    787     return NULL;
    788   }
    789 
    790   return AddSymbol<Force, Resolve>(pName,
    791                                    pType,
    792                                    pDesc,
    793                                    pBinding,
    794                                    pSize,
    795                                    pValue,
    796                                    pFragmentRef,
    797                                    pVisibility);
    798 }
    799 
    800