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