Index: lib/MC/MCParser/COFFAsmParser.cpp =================================================================== --- lib/MC/MCParser/COFFAsmParser.cpp +++ lib/MC/MCParser/COFFAsmParser.cpp @@ -157,15 +157,16 @@ bool COFFAsmParser::ParseSectionFlags(StringRef FlagsString, unsigned* Flags) { enum { - None = 0, - Alloc = 1 << 0, - Code = 1 << 1, - Load = 1 << 2, - InitData = 1 << 3, - Shared = 1 << 4, - NoLoad = 1 << 5, - NoRead = 1 << 6, - NoWrite = 1 << 7 + None = 0, + Alloc = 1 << 0, + Code = 1 << 1, + Load = 1 << 2, + InitData = 1 << 3, + Shared = 1 << 4, + NoLoad = 1 << 5, + NoRead = 1 << 6, + NoWrite = 1 << 7, + Discardable = 1 << 8, }; bool ReadOnlyRemoved = false; @@ -198,6 +199,10 @@ SecFlags &= ~Load; break; + case 'D': // discardable + SecFlags |= Discardable; + break; + case 'r': // read-only ReadOnlyRemoved = false; SecFlags |= NoWrite; @@ -249,6 +254,8 @@ *Flags |= COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA; if (SecFlags & NoLoad) *Flags |= COFF::IMAGE_SCN_LNK_REMOVE; + if (SecFlags & Discardable) + *Flags |= COFF::IMAGE_SCN_MEM_DISCARDABLE; if ((SecFlags & NoRead) == 0) *Flags |= COFF::IMAGE_SCN_MEM_READ; if ((SecFlags & NoWrite) == 0) @@ -326,7 +333,8 @@ // a: Ignored. // b: BSS section (uninitialized data) // d: data section (initialized data) -// n: Discardable section +// n: "noload" section (removed by linker) +// D: Discardable section // r: Readable section // s: Shared section // w: Writable section Index: lib/MC/MCSectionCOFF.cpp =================================================================== --- lib/MC/MCSectionCOFF.cpp +++ lib/MC/MCSectionCOFF.cpp @@ -64,6 +64,8 @@ OS << 'n'; if (getCharacteristics() & COFF::IMAGE_SCN_MEM_SHARED) OS << 's'; + if (getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE) + OS << 'D'; OS << '"'; if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { Index: test/MC/COFF/section.s =================================================================== --- test/MC/COFF/section.s +++ test/MC/COFF/section.s @@ -30,6 +30,7 @@ .section s_a,"a"; .long 1 .section s_b,"b"; .long 1 .section s_d,"d"; .long 1 +.section s_D,"D"; .long 1 .section s_n,"n"; .long 1 .section s_r,"r"; .long 1 .section s_s,"s"; .long 1 @@ -83,6 +84,15 @@ // CHECK-NEXT: ] // CHECK: } // CHECK: Section { +// CHECK: Name: s_D +// CHECK: Characteristics [ +// CHECK-NEXT: IMAGE_SCN_ALIGN_1BYTES +// CHECK-NEXT: IMAGE_SCN_MEM_DISCARDABLE +// CHECK-NEXT: IMAGE_SCN_MEM_READ +// CHECK-NEXT: IMAGE_SCN_MEM_WRITE +// CHECK-NEXT: ] +// CHECK: } +// CHECK: Section { // CHECK: Name: s_n // CHECK: Characteristics [ // CHECK-NEXT: IMAGE_SCN_ALIGN_1BYTES