15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MCLinker.tcc -------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// addSymbol - add a symbol and resolve it immediately
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<Input::Type FROM>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDSymbol* MCLinker::addSymbol(const llvm::StringRef& pName,
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              ResolveInfo::Type pType,
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              ResolveInfo::Desc pDesc,
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              ResolveInfo::Binding pBinding,
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              ResolveInfo::SizeType pSize,
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              LDSymbol::ValueType pValue,
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                              FragmentRef* pFragmentRef,
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              ResolveInfo::Visibility pVisibility)
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::StringRef symbol_name = pName;
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (!getLDInfo().scripts().renameMap().empty() &&
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      ResolveInfo::Undefined == pDesc) {
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    // If the renameMap is not empty, some symbols should be renamed.
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    // --wrap and --portable defines the symbol rename map.
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ScriptOptions::SymbolRenameMap::iterator renameSym
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                = getLDInfo().scripts().renameMap().find(pName);
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    if (renameSym != getLDInfo().scripts().renameMap().end())
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      symbol_name = renameSym.getEntry()->value();
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (FROM == Input::DynObj)
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return addSymbolFromDynObj(symbol_name,
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pType,
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pDesc,
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pBinding,
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pSize,
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pValue,
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pFragmentRef,
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pVisibility);
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (FROM == Input::Object)
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return addSymbolFromObject(symbol_name,
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pType,
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pDesc,
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pBinding,
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pSize,
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pValue,
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pFragmentRef,
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               pVisibility);
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::report_fatal_error("add a symbol from unknown file type.\n");
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return NULL;
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// defineSymbol - define a new symbol
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<MCLinker::DefinePolicy POLICY, MCLinker::ResolvePolicy RESOLVE>
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDSymbol* MCLinker::defineSymbol(const llvm::StringRef& pName,
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 bool pIsDyn,
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 ResolveInfo::Type pType,
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 ResolveInfo::Desc pDesc,
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 ResolveInfo::Binding pBinding,
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 ResolveInfo::SizeType pSize,
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 LDSymbol::ValueType pValue,
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                 FragmentRef* pFragmentRef,
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 ResolveInfo::Visibility pVisibility)
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // These if/return should be optimized by compiler.
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // This function is defined for clarity.
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (MCLinker::Force == POLICY && MCLinker::Unresolve == RESOLVE)
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return defineSymbolForcefully(pName,
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pIsDyn,
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pType,
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pDesc,
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pBinding,
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pSize,
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pValue,
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pFragmentRef,
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  pVisibility);
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (MCLinker::AsRefered == POLICY && MCLinker::Unresolve == RESOLVE)
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return defineSymbolAsRefered(pName,
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pIsDyn,
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pType,
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pDesc,
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pBinding,
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pSize,
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pValue,
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pFragmentRef,
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                 pVisibility);
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (MCLinker::Force == POLICY && MCLinker::Resolve == RESOLVE)
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return defineAndResolveSymbolForcefully(pName,
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pIsDyn,
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pType,
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pDesc,
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pBinding,
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pSize,
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pValue,
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pFragmentRef,
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            pVisibility);
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (MCLinker::AsRefered == POLICY && MCLinker::Resolve == RESOLVE)
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return defineAndResolveSymbolAsRefered(pName,
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pIsDyn,
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pType,
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pDesc,
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pBinding,
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pSize,
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pValue,
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pFragmentRef,
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                           pVisibility);
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
115