Index: lib/MC/MCSectionELF.cpp =================================================================== --- lib/MC/MCSectionELF.cpp +++ lib/MC/MCSectionELF.cpp @@ -14,6 +14,7 @@ #include "llvm/MC/MCSymbol.h" #include "llvm/Support/ELF.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Format.h" using namespace llvm; @@ -53,6 +54,67 @@ OS << '"'; } +static inline void clearFlags(unsigned &val, unsigned flags) { + val &= ~flags; +} + +// print section header flags to OS and return the set of unknown flags +static unsigned +printSectionFlags(raw_ostream &OS, const Triple &T, unsigned Flags) { + if (Flags & ELF::SHF_ALLOC) { + clearFlags(Flags, ELF::SHF_ALLOC); + OS << 'a'; + } + if (Flags & ELF::SHF_EXCLUDE) { + clearFlags(Flags, ELF::SHF_EXCLUDE); + OS << 'e'; + } + if (Flags & ELF::SHF_EXECINSTR) { + clearFlags(Flags, ELF::SHF_EXECINSTR); + OS << 'x'; + } + if (Flags & ELF::SHF_GROUP) { + clearFlags(Flags, ELF::SHF_GROUP); + OS << 'G'; + } + if (Flags & ELF::SHF_WRITE) { + clearFlags(Flags, ELF::SHF_WRITE); + OS << 'w'; + } + if (Flags & ELF::SHF_MERGE) { + clearFlags(Flags, ELF::SHF_MERGE); + OS << 'M'; + } + if (Flags & ELF::SHF_STRINGS) { + clearFlags(Flags, ELF::SHF_STRINGS); + OS << 'S'; + } + if (Flags & ELF::SHF_TLS) { + clearFlags(Flags, ELF::SHF_TLS); + OS << 'T'; + } + + // If there are target-specific flags, print them. + Triple::ArchType Arch = T.getArch(); + if (Arch == Triple::xcore) { + if (Flags & ELF::XCORE_SHF_CP_SECTION) { + clearFlags(Flags, ELF::XCORE_SHF_CP_SECTION); + OS << 'c'; + } + if (Flags & ELF::XCORE_SHF_DP_SECTION) { + clearFlags(Flags, ELF::XCORE_SHF_DP_SECTION); + OS << 'd'; + } + } else if (Arch == Triple::arm || Arch == Triple::armeb || + Arch == Triple::thumb || Arch == Triple::thumbeb) { + if (Flags & ELF::SHF_ARM_PURECODE) { + clearFlags(Flags, ELF::SHF_ARM_PURECODE); + OS << 'y'; + } + } + return Flags; +} + void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T, raw_ostream &OS, const MCExpr *Subsection) const { @@ -87,37 +149,15 @@ return; } - OS << ",\""; - if (Flags & ELF::SHF_ALLOC) - OS << 'a'; - if (Flags & ELF::SHF_EXCLUDE) - OS << 'e'; - if (Flags & ELF::SHF_EXECINSTR) - OS << 'x'; - if (Flags & ELF::SHF_GROUP) - OS << 'G'; - if (Flags & ELF::SHF_WRITE) - OS << 'w'; - if (Flags & ELF::SHF_MERGE) - OS << 'M'; - if (Flags & ELF::SHF_STRINGS) - OS << 'S'; - if (Flags & ELF::SHF_TLS) - OS << 'T'; - - // If there are target-specific flags, print them. - Triple::ArchType Arch = T.getArch(); - if (Arch == Triple::xcore) { - if (Flags & ELF::XCORE_SHF_CP_SECTION) - OS << 'c'; - if (Flags & ELF::XCORE_SHF_DP_SECTION) - OS << 'd'; - } else if (Arch == Triple::arm || Arch == Triple::armeb || - Arch == Triple::thumb || Arch == Triple::thumbeb) { - if (Flags & ELF::SHF_ARM_PURECODE) - OS << 'y'; - } + OS << ",\""; + llvm::SmallString<8> flagText; + raw_svector_ostream SOS { flagText }; + unsigned UnknownFlags = printSectionFlags(SOS, T, Flags); + if (UnknownFlags) + OS << format_hex(Flags, 0); + else + OS << flagText; OS << '"'; OS << ','; Index: test/CodeGen/Mips/2008-07-15-SmallSection.ll =================================================================== --- test/CodeGen/Mips/2008-07-15-SmallSection.ll +++ test/CodeGen/Mips/2008-07-15-SmallSection.ll @@ -5,11 +5,11 @@ @s0 = constant [8 x i8] c"AAAAAAA\00", align 4 ; CHECK: .type foo,@object -; CHECK-NEXT: .section .sdata,"aw",@progbits +; CHECK-NEXT: .section .sdata,"0x10000003",@progbits @foo = global %struct.anon { i32 2, i32 3 } ; CHECK: .type bar,@object -; CHECK-NEXT: .section .sbss,"aw",@nobits +; CHECK-NEXT: .section .sbss,"0x10000003",@nobits @bar = global %struct.anon zeroinitializer define i8* @A0() nounwind { Index: test/CodeGen/Mips/mips-shf-gprel.s =================================================================== --- test/CodeGen/Mips/mips-shf-gprel.s +++ test/CodeGen/Mips/mips-shf-gprel.s @@ -4,12 +4,18 @@ # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o - \ # RUN: | llvm-readobj -s | FileCheck %s +# RUN: llvm-mc -filetype=asm -triple=mips-unknown-linux %s -o - \ +# RUN: | FileCheck -check-prefix=ASM %s + .sdata .word 0 .sbss .zero 4 +# ASM: .section .sdata,"0x10000003",@progbits +# ASM: .section .sbss,"0x10000003",@nobits + # CHECK: Name: .sdata # CHECK-NEXT: Type: SHT_PROGBITS # CHECK-NEXT: Flags [ (0x10000003)