forked from OSchip/llvm-project
				
			ELF: Do not ICF two sections with different output sections.
Note that this doesn't do the right thing in the case where there is a linker script. We probably need to move output section assignment before ICF to get the correct behaviour here. Differential Revision: https://reviews.llvm.org/D47241 llvm-svn: 333052
This commit is contained in:
		
							parent
							
								
									6de0ca4296
								
							
						
					
					
						commit
						11dc7fcae2
					
				| 
						 | 
				
			
			@ -78,6 +78,7 @@
 | 
			
		|||
#include "SymbolTable.h"
 | 
			
		||||
#include "Symbols.h"
 | 
			
		||||
#include "SyntheticSections.h"
 | 
			
		||||
#include "Writer.h"
 | 
			
		||||
#include "lld/Common/Threads.h"
 | 
			
		||||
#include "llvm/ADT/Hashing.h"
 | 
			
		||||
#include "llvm/BinaryFormat/ELF.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -302,6 +303,13 @@ bool ICF<ELFT>::equalsConstant(const InputSection *A, const InputSection *B) {
 | 
			
		|||
      A->getSize() != B->getSize() || A->Data != B->Data)
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
  // If two sections have different output sections, we cannot merge them.
 | 
			
		||||
  // FIXME: This doesn't do the right thing in the case where there is a linker
 | 
			
		||||
  // script. We probably need to move output section assignment before ICF to
 | 
			
		||||
  // get the correct behaviour here.
 | 
			
		||||
  if (getOutputSectionName(A) != getOutputSectionName(B))
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
  if (A->AreRelocsRela)
 | 
			
		||||
    return constantEq(A, A->template relas<ELFT>(), B,
 | 
			
		||||
                      B->template relas<ELFT>());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -325,7 +325,7 @@ template <class ELFT> void InputSection::copyShtGroup(uint8_t *Buf) {
 | 
			
		|||
    *To++ = Sections[Idx]->getOutputSection()->SectionIndex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
InputSectionBase *InputSection::getRelocatedSection() {
 | 
			
		||||
InputSectionBase *InputSection::getRelocatedSection() const {
 | 
			
		||||
  if (!File || (Type != SHT_RELA && Type != SHT_REL))
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  ArrayRef<InputSectionBase *> Sections = File->getSections();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -317,7 +317,7 @@ public:
 | 
			
		|||
 | 
			
		||||
  static bool classof(const SectionBase *S);
 | 
			
		||||
 | 
			
		||||
  InputSectionBase *getRelocatedSection();
 | 
			
		||||
  InputSectionBase *getRelocatedSection() const;
 | 
			
		||||
 | 
			
		||||
  template <class ELFT, class RelTy>
 | 
			
		||||
  void relocateNonAlloc(uint8_t *Buf, llvm::ArrayRef<RelTy> Rels);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ static bool isSectionPrefix(StringRef Prefix, StringRef Name) {
 | 
			
		|||
  return Name.startswith(Prefix) || Name == Prefix.drop_back();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
StringRef elf::getOutputSectionName(InputSectionBase *S) {
 | 
			
		||||
StringRef elf::getOutputSectionName(const InputSectionBase *S) {
 | 
			
		||||
  if (Config->Relocatable)
 | 
			
		||||
    return S->Name;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,7 +48,7 @@ struct PhdrEntry {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
void addReservedSymbols();
 | 
			
		||||
llvm::StringRef getOutputSectionName(InputSectionBase *S);
 | 
			
		||||
llvm::StringRef getOutputSectionName(const InputSectionBase *S);
 | 
			
		||||
 | 
			
		||||
template <class ELFT> uint32_t calcMipsEFlags();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
# REQUIRES: x86
 | 
			
		||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
 | 
			
		||||
# RUN: ld.lld %t -o %t2 --icf=all --print-icf-sections | count 0
 | 
			
		||||
 | 
			
		||||
.section foo,"ax"
 | 
			
		||||
.byte 42
 | 
			
		||||
 | 
			
		||||
.section bar,"ax"
 | 
			
		||||
.byte 42
 | 
			
		||||
		Loading…
	
		Reference in New Issue