1eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner//===- lib/MC/MCSectionCOFF.cpp - COFF Code Section Representation --------===// 2eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 3eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// The LLVM Compiler Infrastructure 4eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 5eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// This file is distributed under the University of Illinois Open Source 6eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// License. See LICENSE.TXT for details. 7eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 8eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner//===----------------------------------------------------------------------===// 9eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 10eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSectionCOFF.h" 11eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCAsmInfo.h" 12eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCContext.h" 13eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSymbol.h" 14eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/Support/raw_ostream.h" 15eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerusing namespace llvm; 16eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 17eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris LattnerMCSectionCOFF::~MCSectionCOFF() {} // anchor. 18eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 19eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// ShouldOmitSectionDirective - Decides whether a '.section' directive 20eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// should be printed before the section name 21eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerbool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name, 22eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner const MCAsmInfo &MAI) const { 23eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 24eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner // FIXME: Does .section .bss/.data/.text work everywhere?? 25eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (Name == ".text" || Name == ".data" || Name == ".bss") 26eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return true; 27eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 28eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return false; 29eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner} 30eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 31eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnervoid MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, 32eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner raw_ostream &OS) const { 33eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 3472e57f94416b5bc293d5f735ee81318d3ff16590Nathan Jeffords // standard sections don't require the '.section' 35eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (ShouldOmitSectionDirective(SectionName, MAI)) { 36eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << '\t' << getSectionName() << '\n'; 37eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return; 38eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner } 39eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 40eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << "\t.section\t" << getSectionName() << ",\""; 41eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (getKind().isText()) 42eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << 'x'; 43eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (getKind().isWriteable()) 44eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << 'w'; 45eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else 46eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << 'r'; 4794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar if (getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE) 48eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << 'n'; 49eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner OS << "\"\n"; 50871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords 5194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { 52871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords switch (Selection) { 5394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar case COFF::IMAGE_COMDAT_SELECT_NODUPLICATES: 54871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords OS << "\t.linkonce one_only\n"; 55871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords break; 5694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar case COFF::IMAGE_COMDAT_SELECT_ANY: 57871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords OS << "\t.linkonce discard\n"; 58871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords break; 5994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar case COFF::IMAGE_COMDAT_SELECT_SAME_SIZE: 60871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords OS << "\t.linkonce same_size\n"; 61871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords break; 6294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH: 63871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords OS << "\t.linkonce same_contents\n"; 64871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords break; 6562d50e89e40cb7fac444bde21bcab10fd69d68e3Nathan Jeffords //NOTE: as of binutils 2.20, there is no way to specifiy select largest 6662d50e89e40cb7fac444bde21bcab10fd69d68e3Nathan Jeffords // with the .linkonce directive. For now, we treat it as an invalid 6762d50e89e40cb7fac444bde21bcab10fd69d68e3Nathan Jeffords // comdat selection value. 6894610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar case COFF::IMAGE_COMDAT_SELECT_LARGEST: 69871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords // OS << "\t.linkonce largest\n"; 70871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords // break; 7162d50e89e40cb7fac444bde21bcab10fd69d68e3Nathan Jeffords default: 7262d50e89e40cb7fac444bde21bcab10fd69d68e3Nathan Jeffords assert (0 && "unsupported COFF selection type"); 7362d50e89e40cb7fac444bde21bcab10fd69d68e3Nathan Jeffords break; 74871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords } 75871bb94c4343dcc7391af7833ebb4313a782440bNathan Jeffords } 76eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner} 77083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung 78083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voungbool MCSectionCOFF::UseCodeAlign() const { 79083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung return getKind().isText(); 80083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung} 81f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola 82f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindolabool MCSectionCOFF::isVirtualSection() const { 83f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola return getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA; 84f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola} 85