forked from OSchip/llvm-project
				
			[ELF][MIPS] Delete GotSection::addMipsLocalEntry method
Now local symbols have SymbolBody so we can handle all kind of symbols in the GotSection::addEntry method. The patch moves the code from addMipsLocalEntry to addEntry. NFC. Differential Revision: http://reviews.llvm.org/D18302 llvm-svn: 264032
This commit is contained in:
		
							parent
							
								
									b1cad2954b
								
							
						
					
					
						commit
						f3ec3be178
					
				| 
						 | 
				
			
			@ -90,14 +90,22 @@ GotSection<ELFT>::GotSection()
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
template <class ELFT> void GotSection<ELFT>::addEntry(SymbolBody &Sym) {
 | 
			
		||||
  if (Config->EMachine == EM_MIPS) {
 | 
			
		||||
    if (Sym.isPreemptible())
 | 
			
		||||
      // All symbols with MIPS GOT entries should be represented
 | 
			
		||||
      // in the dynamic symbols table. See "Global Offset Table" in Chapter 5:
 | 
			
		||||
      // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
 | 
			
		||||
      Sym.MustBeInDynSym = true;
 | 
			
		||||
    else {
 | 
			
		||||
      // FIXME (simon): Do not add so many redundant entries.
 | 
			
		||||
      ++MipsLocalEntries;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  Sym.GotIndex = Entries.size();
 | 
			
		||||
  Entries.push_back(&Sym);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class ELFT> void GotSection<ELFT>::addMipsLocalEntry() {
 | 
			
		||||
  ++MipsLocalEntries;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class ELFT> bool GotSection<ELFT>::addDynTlsEntry(SymbolBody &Sym) {
 | 
			
		||||
  if (Sym.hasGlobalDynIndex())
 | 
			
		||||
    return false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,7 +100,6 @@ public:
 | 
			
		|||
  void finalize() override;
 | 
			
		||||
  void writeTo(uint8_t *Buf) override;
 | 
			
		||||
  void addEntry(SymbolBody &Sym);
 | 
			
		||||
  void addMipsLocalEntry();
 | 
			
		||||
  bool addDynTlsEntry(SymbolBody &Sym);
 | 
			
		||||
  bool addTlsIndex();
 | 
			
		||||
  bool empty() const { return MipsLocalEntries == 0 && Entries.empty(); }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -335,14 +335,6 @@ void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &C,
 | 
			
		|||
      Out<ELFT>::RelaDyn->addReloc({Target->RelativeRel, &C, RI.r_offset, true,
 | 
			
		||||
                                    &Body, getAddend<ELFT>(RI)});
 | 
			
		||||
 | 
			
		||||
    // MIPS has a special rule to create GOTs for local symbols.
 | 
			
		||||
    if (Config->EMachine == EM_MIPS && !Preemptible &&
 | 
			
		||||
        Target->needsGot(Type, Body)) {
 | 
			
		||||
      // FIXME (simon): Do not add so many redundant entries.
 | 
			
		||||
      Out<ELFT>::Got->addMipsLocalEntry();
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // If a symbol in a DSO is referenced directly instead of through GOT,
 | 
			
		||||
    // we need to create a copy relocation for the symbol.
 | 
			
		||||
    if (auto *B = dyn_cast<SharedSymbol<ELFT>>(&Body)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -407,15 +399,13 @@ void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &C,
 | 
			
		|||
        continue;
 | 
			
		||||
      Out<ELFT>::Got->addEntry(Body);
 | 
			
		||||
 | 
			
		||||
      if (Config->EMachine == EM_MIPS) {
 | 
			
		||||
      if (Config->EMachine == EM_MIPS)
 | 
			
		||||
        // MIPS ABI has special rules to process GOT entries
 | 
			
		||||
        // and doesn't require relocation entries for them.
 | 
			
		||||
        // See "Global Offset Table" in Chapter 5 in the following document
 | 
			
		||||
        // for detailed description:
 | 
			
		||||
        // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
 | 
			
		||||
        Body.MustBeInDynSym = true;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      bool Dynrel = Config->Pic && !Target->isRelRelative(Type) &&
 | 
			
		||||
                    !Target->isSizeRel(Type);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue