llvm-6502/lib/Target/PIC16/PIC16Section.h
Jan Wen Voung 083cf1574f Add hook in MCSection to decide when to use "optimized nops", for each
section kind. Previously, optimized nops were only used for MachO.
Also added tests for ELF and COFF.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115523 91177308-0d34-0410-b5e6-96231b3b80d8
2010-10-04 17:32:41 +00:00

102 lines
3.3 KiB
C++

//===- PIC16Section.h - PIC16-specific section representation -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the PIC16Section class.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_PIC16SECTION_H
#define LLVM_PIC16SECTION_H
#include "llvm/MC/MCSection.h"
#include "llvm/GlobalVariable.h"
#include <vector>
namespace llvm {
/// PIC16Section - Represents a physical section in PIC16 COFF.
/// Contains data objects.
///
class PIC16Section : public MCSection {
/// PIC16 Sections does not really use the SectionKind class to
/// to distinguish between various types of sections. PIC16 maintain
/// its own Section Type info. See the PIC16SectionType enum in PIC16.h
/// for various section types.
PIC16SectionType T;
/// Name of the section to uniquely identify it.
StringRef Name;
/// User can specify an address at which a section should be placed.
/// Negative value here means user hasn't specified any.
StringRef Address;
/// Overlay information - Sections with same color can be overlaid on
/// one another.
int Color;
/// Total size of all data objects contained here.
unsigned Size;
PIC16Section(StringRef name, SectionKind K, StringRef addr, int color)
: MCSection(SV_PIC16, K), Name(name), Address(addr),
Color(color), Size(0) {
}
public:
/// Return the name of the section.
StringRef getName() const { return Name; }
/// Return the Address of the section.
StringRef getAddress() const { return Address; }
/// Return the Color of the section.
int getColor() const { return Color; }
void setColor(int color) { Color = color; }
/// Return the size of the section.
unsigned getSize() const { return Size; }
void setSize(unsigned size) { Size = size; }
/// Conatined data objects.
// FIXME: This vector is leaked because sections are allocated with a
// BumpPtrAllocator.
std::vector<const GlobalVariable *>Items;
/// Check section type.
bool isUDATA_Type() const { return T == UDATA; }
bool isIDATA_Type() const { return T == IDATA; }
bool isROMDATA_Type() const { return T == ROMDATA; }
bool isUDATA_OVR_Type() const { return T == UDATA_OVR; }
bool isUDATA_SHR_Type() const { return T == UDATA_SHR; }
bool isCODE_Type() const { return T == CODE; }
PIC16SectionType getType() const { return T; }
/// This would be the only way to create a section.
static PIC16Section *Create(StringRef Name, PIC16SectionType Ty,
StringRef Address, int Color,
MCContext &Ctx);
/// Override this as PIC16 has its own way of printing switching
/// to a section.
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
raw_ostream &OS) const;
virtual bool UseCodeAlign() const;
static bool classof(const MCSection *S) {
return S->getVariant() == SV_PIC16;
}
static bool classof(const PIC16Section *) { return true; }
};
} // end namespace llvm
#endif