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