diff --git a/test/tools/llvm-size/output-alloc.test b/test/tools/llvm-size/output-alloc.test new file mode 100644 index 00000000000..9882126bdd6 --- /dev/null +++ b/test/tools/llvm-size/output-alloc.test @@ -0,0 +1,38 @@ +## gnu size has a number of special cases regarding REL, RELA and STRTAB sections being considered in size output. +## To avoid unnecessary complexity llvm size outputs these sections in cases they have the SHF_ALLOC flag. + +# RUN: yaml2obj %s -o %t1 +# RUN: llvm-size --format=sysv %t1 | FileCheck %s + +# CHECK: section size addr +# CHECK-NEXT: .rela.alloc +# CHECK-NEXT: .rel.alloc +# CHECK-NEXT: .strtab.alloc +# CHECK-NEXT: Total +# CHECK-EMPTY: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .rela.alloc + Type: SHT_RELA + Flags: [ SHF_ALLOC ] + - Name: .rel.alloc + Type: SHT_REL + Flags: [ SHF_ALLOC ] + - Name: .strtab.alloc + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + - Name: .rela + Type: SHT_RELA + Flags: [] + - Name: .rel + Type: SHT_REL + Flags: [] + - Name: .strtab + Type: SHT_STRTAB + Flags: [] diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp index b79622823fe..987270e98c4 100644 --- a/tools/llvm-size/llvm-size.cpp +++ b/tools/llvm-size/llvm-size.cpp @@ -187,10 +187,11 @@ static bool considerForSize(ObjectFile *Obj, SectionRef Section) { switch (static_cast(Section).getType()) { case ELF::SHT_NULL: case ELF::SHT_SYMTAB: + return false; case ELF::SHT_STRTAB: case ELF::SHT_REL: case ELF::SHT_RELA: - return false; + return static_cast(Section).getFlags() & ELF::SHF_ALLOC; } return true; }