From 766de4dd24ccd1773f2a5fbdf4aeb4d9df5a1e71 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 15 Feb 2017 00:15:54 +0000 Subject: [PATCH] Split WinCOFFObjectWriter::defineSection. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295128 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFObjectWriter.cpp | 85 +++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 47 deletions(-) diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 075e27ec617..b5dac823391 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -239,11 +239,47 @@ COFFSection *WinCOFFObjectWriter::createSection(StringRef Name) { return Sections.back().get(); } +static uint32_t getAlignment(const MCSectionCOFF &Sec) { + switch (Sec.getAlignment()) { + case 1: + return COFF::IMAGE_SCN_ALIGN_1BYTES; + case 2: + return COFF::IMAGE_SCN_ALIGN_2BYTES; + case 4: + return COFF::IMAGE_SCN_ALIGN_4BYTES; + case 8: + return COFF::IMAGE_SCN_ALIGN_8BYTES; + case 16: + return COFF::IMAGE_SCN_ALIGN_16BYTES; + case 32: + return COFF::IMAGE_SCN_ALIGN_32BYTES; + case 64: + return COFF::IMAGE_SCN_ALIGN_64BYTES; + case 128: + return COFF::IMAGE_SCN_ALIGN_128BYTES; + case 256: + return COFF::IMAGE_SCN_ALIGN_256BYTES; + case 512: + return COFF::IMAGE_SCN_ALIGN_512BYTES; + case 1024: + return COFF::IMAGE_SCN_ALIGN_1024BYTES; + case 2048: + return COFF::IMAGE_SCN_ALIGN_2048BYTES; + case 4096: + return COFF::IMAGE_SCN_ALIGN_4096BYTES; + case 8192: + return COFF::IMAGE_SCN_ALIGN_8192BYTES; + } + llvm_unreachable("unsupported section alignment"); +} + /// This function takes a section data object from the assembler /// and creates the associated COFF section staging object. -void WinCOFFObjectWriter::defineSection(MCSectionCOFF const &Sec) { +void WinCOFFObjectWriter::defineSection(const MCSectionCOFF &Sec) { COFFSection *coff_section = createSection(Sec.getSectionName()); COFFSymbol *coff_symbol = createSymbol(Sec.getSectionName()); + + // Create a COMDAT symbol if needed. if (Sec.getSelection() != COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) { if (const MCSymbol *S = Sec.getCOMDATSymbol()) { COFFSymbol *COMDATSymbol = GetOrCreateCOFFSymbol(S); @@ -266,52 +302,7 @@ void WinCOFFObjectWriter::defineSection(MCSectionCOFF const &Sec) { coff_section->Header.Characteristics = Sec.getCharacteristics(); uint32_t &Characteristics = coff_section->Header.Characteristics; - switch (Sec.getAlignment()) { - case 1: - Characteristics |= COFF::IMAGE_SCN_ALIGN_1BYTES; - break; - case 2: - Characteristics |= COFF::IMAGE_SCN_ALIGN_2BYTES; - break; - case 4: - Characteristics |= COFF::IMAGE_SCN_ALIGN_4BYTES; - break; - case 8: - Characteristics |= COFF::IMAGE_SCN_ALIGN_8BYTES; - break; - case 16: - Characteristics |= COFF::IMAGE_SCN_ALIGN_16BYTES; - break; - case 32: - Characteristics |= COFF::IMAGE_SCN_ALIGN_32BYTES; - break; - case 64: - Characteristics |= COFF::IMAGE_SCN_ALIGN_64BYTES; - break; - case 128: - Characteristics |= COFF::IMAGE_SCN_ALIGN_128BYTES; - break; - case 256: - Characteristics |= COFF::IMAGE_SCN_ALIGN_256BYTES; - break; - case 512: - Characteristics |= COFF::IMAGE_SCN_ALIGN_512BYTES; - break; - case 1024: - Characteristics |= COFF::IMAGE_SCN_ALIGN_1024BYTES; - break; - case 2048: - Characteristics |= COFF::IMAGE_SCN_ALIGN_2048BYTES; - break; - case 4096: - Characteristics |= COFF::IMAGE_SCN_ALIGN_4096BYTES; - break; - case 8192: - Characteristics |= COFF::IMAGE_SCN_ALIGN_8192BYTES; - break; - default: - llvm_unreachable("unsupported section alignment"); - } + Characteristics |= getAlignment(Sec); // Bind internal COFF section to MC section. coff_section->MCSection = &Sec; -- 2.11.0