Index: llvm/test/MC/ARM/elf-execute-only-section.ll =================================================================== --- llvm/test/MC/ARM/elf-execute-only-section.ll +++ llvm/test/MC/ARM/elf-execute-only-section.ll @@ -5,8 +5,8 @@ ; RUN: llc < %s -mtriple=thumbv7m-eabi -mattr=+execute-only -filetype=obj %s -o - | \ ; RUN: llvm-readelf -S | FileCheck %s -; CHECK-NOT: {{.text[ ]+PROGBITS[ ]+[0-9]+ [0-9]+ [0-9]+ [0-9]+ AX[^p]}} -; CHECK: {{.text[ ]+PROGBITS[ ]+[0-9]+ [0-9]+ [0-9]+ [0-9]+ AXp}} +; CHECK-NOT: {{.text[ ]+PROGBITS[ ]+[0-9]+ [0-9]+ [0-9]+ [0-9]+ AX[^y]}} +; CHECK: {{.text[ ]+PROGBITS[ ]+[0-9]+ [0-9]+ [0-9]+ [0-9]+ AXy}} define void @test_func() { entry: ret void Index: llvm/test/tools/llvm-readobj/ELF/section-arch-flags.test =================================================================== --- llvm/test/tools/llvm-readobj/ELF/section-arch-flags.test +++ llvm/test/tools/llvm-readobj/ELF/section-arch-flags.test @@ -57,12 +57,23 @@ # RUN: llvm-readobj -S %t-x86_64.o | FileCheck --check-prefix=X86_64-LLVM %s # RUN: llvm-readelf -S %t-x86_64.o | FileCheck --check-prefix=X86_64-GNU %s -# X86_64-LLVM: Flags [ (0x10000000) +# X86_64-LLVM: Name: .x86_64 +# X86_64-LLVM-NEXT: Type: SHT_PROGBITS +# X86_64-LLVM-NEXT: Flags [ (0x10000000) # X86_64-LLVM-NEXT: SHF_X86_64_LARGE (0x10000000) # X86_64-LLVM-NEXT: ] -# X86_64-GNU: [Nr] Name Type Address Off Size ES Flg Lk Inf Al -# X86_64-GNU: [ 1] .x86_64 PROGBITS 0000000000000000 000040 000000 00 p 0 0 0 +# X86_64-LLVM: Name: .with.exclude +# X86_64-LLVM-NEXT: Type: SHT_PROGBITS +# X86_64-LLVM-NEXT: Flags [ (0x90000000) +# X86_64-LLVM-NEXT: SHF_EXCLUDE (0x80000000) +# X86_64-LLVM-NEXT: SHF_X86_64_LARGE (0x10000000) +# X86_64-LLVM-NEXT: ] + +## Despite of the fact that "lE" looks a bit strange, this matches the GNU order. +# X86_64-GNU: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# X86_64-GNU: [ 1] .x86_64 PROGBITS 0000000000000000 000040 000000 00 l 0 0 0 +# X86_64-GNU: [ 2] .with.exclude PROGBITS 0000000000000000 000040 000000 00 lE 0 0 0 --- !ELF FileHeader: @@ -74,6 +85,9 @@ - Name: .x86_64 Type: SHT_PROGBITS Flags: [ SHF_X86_64_LARGE ] + - Name: .with.exclude + Type: SHT_PROGBITS + Flags: [ SHF_X86_64_LARGE, SHF_EXCLUDE ] # RUN: yaml2obj --docnum 4 %s -o %t-arm.o # RUN: llvm-readobj -S %t-arm.o | FileCheck --check-prefix=ARM-LLVM %s @@ -84,7 +98,7 @@ # ARM-LLVM-NEXT: ] # ARM-GNU: [Nr] Name Type Address Off Size ES Flg Lk Inf Al -# ARM-GNU: [ 1] foo PROGBITS 0000000000000000 000040 000000 00 p 0 0 0 +# ARM-GNU: [ 1] foo PROGBITS 0000000000000000 000040 000000 00 y 0 0 0 --- !ELF FileHeader: Index: llvm/tools/llvm-readobj/ELFDumper.cpp =================================================================== --- llvm/tools/llvm-readobj/ELFDumper.cpp +++ llvm/tools/llvm-readobj/ELFDumper.cpp @@ -1474,7 +1474,7 @@ LLVM_READOBJ_ENUM_ENT(ELF, SHF_X86_64_LARGE) }; -static std::string getGNUFlags(uint64_t Flags) { +static std::string getGNUFlags(unsigned EMachine, uint64_t Flags) { // Here we are trying to build the flags string in the same way as GNU does. // It is not that straightforward. Imagine we have sh_flags == 0x90000000. // SHF_EXCLUDE ("E") has a value of 0x80000000 and SHF_MASKPROC is 0xf0000000. @@ -1501,7 +1501,13 @@ // If we did not find a matching regular flag, then we deal with a OS // specific flag, proccessor specific flag or an unknown flag. - if (Flag & ELF::SHF_MASKOS) { + if (EMachine == EM_X86_64 && Flag == SHF_X86_64_LARGE) { + Str += "l"; + Flags &= ~ELF::SHF_X86_64_LARGE; + } else if (EMachine == EM_ARM && Flag == SHF_ARM_PURECODE) { + Str += "y"; + Flags &= ~ELF::SHF_X86_64_LARGE; + } else if (Flag & ELF::SHF_MASKOS) { HasOSFlag = true; Flags &= ~ELF::SHF_MASKOS; } else if (Flag & ELF::SHF_MASKPROC) { @@ -3542,7 +3548,7 @@ Fields[4].Str = to_string(format_hex_no_prefix(Sec.sh_offset, 6)); Fields[5].Str = to_string(format_hex_no_prefix(Sec.sh_size, 6)); Fields[6].Str = to_string(format_hex_no_prefix(Sec.sh_entsize, 2)); - Fields[7].Str = getGNUFlags(Sec.sh_flags); + Fields[7].Str = getGNUFlags(Obj->getHeader()->e_machine, Sec.sh_flags); Fields[8].Str = to_string(Sec.sh_link); Fields[9].Str = to_string(Sec.sh_info); Fields[10].Str = to_string(Sec.sh_addralign);