summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/WinCOFFObjectWriter.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2017-02-15 00:15:54 +0000
committerRui Ueyama <ruiu@google.com>2017-02-15 00:15:54 +0000
commit24e27b474c61e25fb0e967300d7e46185a032f49 (patch)
tree9857d38ffc51ec4cdc7550d682560dbcaa3eb873 /llvm/lib/MC/WinCOFFObjectWriter.cpp
parentdef72aad0bc124dc7f40d19b8221ed27659b07a4 (diff)
downloadbcm5719-llvm-24e27b474c61e25fb0e967300d7e46185a032f49.tar.gz
bcm5719-llvm-24e27b474c61e25fb0e967300d7e46185a032f49.zip
Split WinCOFFObjectWriter::defineSection. NFC.
llvm-svn: 295128
Diffstat (limited to 'llvm/lib/MC/WinCOFFObjectWriter.cpp')
-rw-r--r--llvm/lib/MC/WinCOFFObjectWriter.cpp85
1 files changed, 38 insertions, 47 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index 075e27ec617..b5dac823391 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/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;
OpenPOWER on IntegriCloud