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/DebugInfo/COFF/asm.ll =================================================================== --- test/DebugInfo/COFF/asm.ll +++ test/DebugInfo/COFF/asm.ll @@ -21,7 +21,7 @@ ; X86: ret ; X86: [[END_OF_F:.?Lfunc_end.*]]: ; -; X86-LABEL: .section .debug$S,"dr" +; X86-LABEL: .section .debug$S,"drD" ; X86-NEXT: .p2align 2 ; X86-NEXT: .long 4 ; Symbol subsection @@ -114,7 +114,7 @@ ; X64-NEXT: ret ; X64: [[END_OF_F:.?Lfunc_end.*]]: ; -; X64-LABEL: .section .debug$S,"dr" +; X64-LABEL: .section .debug$S,"drD" ; X64-NEXT: .p2align 2 ; X64-NEXT: .long 4 ; Symbol subsection Index: test/DebugInfo/COFF/comdat.ll =================================================================== --- test/DebugInfo/COFF/comdat.ll +++ test/DebugInfo/COFF/comdat.ll @@ -5,7 +5,7 @@ ; Start in the main symbol section describing bar and main. -; CHECK: .section .debug$S,"dr"{{$}} +; CHECK: .section .debug$S,"drD"{{$}} ; CHECK: .long 4 # Debug section magic ; CHECK: # Symbol subsection for bar ; CHECK-NOT: Debug section magic @@ -14,7 +14,7 @@ ; Emit symbol info for f and its associated code in a separate associated ; section. -; CHECK: .section .debug$S,"dr",associative,f{{$}} +; CHECK: .section .debug$S,"drD",associative,f{{$}} ; CHECK: .long 4 # Debug section magic ; CHECK: # Symbol subsection for f ; CHECK-NOT: Debug section magic @@ -23,7 +23,7 @@ ; Switch back to the main section for the shared file checksum table and string ; table. -; CHECK: .section .debug$S,"dr"{{$}} +; CHECK: .section .debug$S,"drD"{{$}} ; CHECK-NOT: Debug section magic ; CHECK: .cv_filechecksums ; CHECK: .cv_stringtable Index: test/DebugInfo/COFF/globals.ll =================================================================== --- test/DebugInfo/COFF/globals.ll +++ test/DebugInfo/COFF/globals.ll @@ -9,7 +9,7 @@ ; int last; ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll -; ASM: .section .debug$S,"dr" +; ASM: .section .debug$S,"drD" ; ASM: .p2align 2 ; ASM: .long 4 # Debug section magic @@ -34,7 +34,7 @@ ; ASM: .secidx "?last@@3HA" # Segment ; ASM: .asciz "last" # Name -; ASM: .section .debug$S,"dr",associative,"?comdat@?$A@X@@2HB" +; ASM: .section .debug$S,"drD",associative,"?comdat@?$A@X@@2HB" ; ASM: .p2align 2 ; ASM: .long 4 # Debug section magic Index: test/DebugInfo/COFF/inlining.ll =================================================================== --- test/DebugInfo/COFF/inlining.ll +++ test/DebugInfo/COFF/inlining.ll @@ -42,7 +42,7 @@ ; ASM: addl $7, "?x@@3HC" ; ASM: .cv_loc 0 1 17 1 # t.cpp:17:1 -; ASM: .section .debug$S,"dr" +; ASM: .section .debug$S,"drD" ; ASM: .long 246 # Inlinee lines subsection ; ASM: .long [[inline_end:.*]]-[[inline_beg:.*]] # ; ASM: [[inline_beg]]: @@ -72,7 +72,7 @@ ; ASM: .short 4430 ; ASM: .short 4430 -; ASM: .section .debug$T,"dr" +; ASM: .section .debug$T,"drD" ; ASM: .long 4 # Debug section magic ; ASM: # ArgList (0x1000) { ; ASM: # TypeLeafKind: LF_ARGLIST (0x1201) Index: test/DebugInfo/COFF/multifile.ll =================================================================== --- test/DebugInfo/COFF/multifile.ll +++ test/DebugInfo/COFF/multifile.ll @@ -30,7 +30,7 @@ ; X86: ret ; X86: [[END_OF_F:.?Lfunc_end.*]]: ; -; X86-LABEL: .section .debug$S,"dr" +; X86-LABEL: .section .debug$S,"drD" ; X86-NEXT: .p2align 2 ; X86-NEXT: .long 4 ; Symbol subsection @@ -138,7 +138,7 @@ ; X64-NEXT: ret ; X64: [[END_OF_F:.?Lfunc_end.*]]: ; -; X64-LABEL: .section .debug$S,"dr" +; X64-LABEL: .section .debug$S,"drD" ; X64-NEXT: .p2align 2 ; X64-NEXT: .long 4 ; Symbol subsection Index: test/DebugInfo/COFF/multifunction.ll =================================================================== --- test/DebugInfo/COFF/multifunction.ll +++ test/DebugInfo/COFF/multifunction.ll @@ -51,7 +51,7 @@ ; X86: ret ; X86: [[END_OF_F:.?Lfunc_end.*]]: ; -; X86-LABEL: .section .debug$S,"dr" +; X86-LABEL: .section .debug$S,"drD" ; X86-NEXT: .p2align 2 ; X86-NEXT: .long 4 ; Symbol subsection for x @@ -318,7 +318,7 @@ ; X64-NEXT: ret ; X64: [[END_OF_F:.?Lfunc_end.*]]: ; -; X64-LABEL: .section .debug$S,"dr" +; X64-LABEL: .section .debug$S,"drD" ; X64-NEXT: .p2align 2 ; X64-NEXT: .long 4 ; Symbol subsection for x Index: test/DebugInfo/COFF/pr28747.ll =================================================================== --- test/DebugInfo/COFF/pr28747.ll +++ test/DebugInfo/COFF/pr28747.ll @@ -1,6 +1,6 @@ ; RUN: llc < %s | FileCheck %s -; CHECK: .section .debug$S,"dr"{{$}} +; CHECK: .section .debug$S,"drD"{{$}} ; CHECK-NEXT: .p2align 2 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .cv_filechecksums Index: test/DebugInfo/COFF/simple.ll =================================================================== --- test/DebugInfo/COFF/simple.ll +++ test/DebugInfo/COFF/simple.ll @@ -20,7 +20,7 @@ ; X86: ret ; X86: [[END_OF_F:Lfunc_end.*]]: ; -; X86-LABEL: .section .debug$S,"dr" +; X86-LABEL: .section .debug$S,"drD" ; X86-NEXT: .p2align 2 ; X86-NEXT: .long 4 ; Symbol subsection @@ -110,7 +110,7 @@ ; X64-NEXT: ret ; X64: [[END_OF_F:.?Lfunc_end.*]]: ; -; X64-LABEL: .section .debug$S,"dr" +; X64-LABEL: .section .debug$S,"drD" ; X64-NEXT: .p2align 2 ; X64-NEXT: .long 4 ; Symbol subsection Index: test/DebugInfo/COFF/tail-call-without-lexical-scopes.ll =================================================================== --- test/DebugInfo/COFF/tail-call-without-lexical-scopes.ll +++ test/DebugInfo/COFF/tail-call-without-lexical-scopes.ll @@ -23,7 +23,7 @@ ; X86: [[END_OF_BAR:.?Lfunc_end.*]]:{{$}} ; X86-NOT: ret -; X86-LABEL: .section .debug$S,"dr" +; X86-LABEL: .section .debug$S,"drD" ; X86: .secrel32 "?bar@@YAXHZZ" ; X86-NEXT: .secidx "?bar@@YAXHZZ" ; X86: .cv_linetable 1, "?bar@@YAXHZZ", [[END_OF_BAR]] Index: test/DebugInfo/X86/coff_debug_info_type.ll =================================================================== --- test/DebugInfo/X86/coff_debug_info_type.ll +++ test/DebugInfo/X86/coff_debug_info_type.ll @@ -8,7 +8,7 @@ ; RUN: sed -e 's/"Dwarf Version"/"CodeView"/' %s \ ; RUN: | llc -mtriple=i686-pc-win32 -filetype=asm -O0 \ ; RUN: | FileCheck -check-prefix=WIN32 %s -; WIN32: .section .debug$S,"dr" +; WIN32: .section .debug$S,"drD" ; RUN: llc -mtriple=i686-pc-win32 -filetype=null -O0 < %s 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