llvm/lib/Target/PIC16/PIC16Section.h
Sanjiv Gupta 4e4bba5c80 Add a pass to overlay pic16 data sections for function frame and automatic
variables. This pass can be invoked by llvm-ld or opt to traverse over the call graph 
to detect what function frames and their automatic variables can be overlaid.
Currently this builds an archive , but needs to be changed to a loadable module.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84753 91177308-0d34-0410-b5e6-96231b3b80d8
2009-10-21 10:42:44 +00:00

93 lines
3.1 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.
std::string Name;
/// User can specify an address at which a section should be placed.
/// Negative value here means user hasn't specified any.
std::string 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(const StringRef &name, SectionKind K, const std::string &addr,
int color)
: MCSection(K), Name(name), Address(addr), Color(color) {
}
public:
/// Return the name of the section.
const std::string &getName() const { return Name; }
/// Return the Address of the section.
const std::string &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.
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(const StringRef &Name, PIC16SectionType Ty,
const std::string &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;
};
} // end namespace llvm
#endif