MCSectionCOFF.cpp revision 72e57f94416b5bc293d5f735ee81318d3ff16590
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';
476e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner  if (getCharacteristics() & MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE)
48eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    OS << 'n';
49eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  OS << "\"\n";
50eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner}
51