mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-24 22:32:47 +00:00
967ce7f5e1
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77846 91177308-0d34-0410-b5e6-96231b3b80d8
106 lines
4.0 KiB
C++
106 lines
4.0 KiB
C++
//===-- PIC16TargetObjectFile.h - PIC16 Object Info -------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TARGET_PIC16_TARGETOBJECTFILE_H
|
|
#define LLVM_TARGET_PIC16_TARGETOBJECTFILE_H
|
|
|
|
#include "llvm/Target/TargetLoweringObjectFile.h"
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class GlobalVariable;
|
|
class Module;
|
|
class PIC16TargetMachine;
|
|
|
|
enum { DataBankSize = 80 };
|
|
|
|
/// PIC16 Splits the global data into mulitple udata and idata sections.
|
|
/// Each udata and idata section needs to contain a list of globals that
|
|
/// they contain, in order to avoid scanning over all the global values
|
|
/// again and printing only those that match the current section.
|
|
/// Keeping values inside the sections make printing a section much easier.
|
|
///
|
|
/// FIXME: Reimplement by inheriting from MCSection.
|
|
///
|
|
struct PIC16Section {
|
|
const MCSection *S_; // Connection to actual Section.
|
|
unsigned Size; // Total size of the objects contained.
|
|
bool SectionPrinted;
|
|
std::vector<const GlobalVariable*> Items;
|
|
|
|
PIC16Section(const MCSection *s) {
|
|
S_ = s;
|
|
Size = 0;
|
|
SectionPrinted = false;
|
|
}
|
|
bool isPrinted() const { return SectionPrinted; }
|
|
void setPrintedStatus(bool status) { SectionPrinted = status; }
|
|
};
|
|
|
|
class PIC16TargetObjectFile : public TargetLoweringObjectFile {
|
|
const TargetMachine *TM;
|
|
public:
|
|
mutable std::vector<PIC16Section*> BSSSections;
|
|
mutable std::vector<PIC16Section*> IDATASections;
|
|
mutable std::vector<PIC16Section*> AutosSections;
|
|
mutable std::vector<PIC16Section*> ROSections;
|
|
mutable PIC16Section *ExternalVarDecls;
|
|
mutable PIC16Section *ExternalVarDefs;
|
|
|
|
PIC16TargetObjectFile();
|
|
~PIC16TargetObjectFile();
|
|
|
|
void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
|
|
|
|
|
/// getSpecialCasedSectionGlobals - Allow the target to completely override
|
|
/// section assignment of a global.
|
|
virtual const MCSection *
|
|
getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang,
|
|
SectionKind Kind) const;
|
|
virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
|
|
SectionKind Kind,
|
|
Mangler *Mang,
|
|
const TargetMachine&) const;
|
|
private:
|
|
std::string getSectionNameForSym(const std::string &Sym) const;
|
|
|
|
const MCSection *getBSSSectionForGlobal(const GlobalVariable *GV) const;
|
|
const MCSection *getIDATASectionForGlobal(const GlobalVariable *GV) const;
|
|
const MCSection *getSectionForAuto(const GlobalVariable *GV) const;
|
|
const MCSection *CreateBSSSectionForGlobal(const GlobalVariable *GV,
|
|
std::string Addr = "") const;
|
|
const MCSection *CreateIDATASectionForGlobal(const GlobalVariable *GV,
|
|
std::string Addr = "") const;
|
|
const MCSection *getROSectionForGlobal(const GlobalVariable *GV) const;
|
|
const MCSection *CreateROSectionForGlobal(const GlobalVariable *GV,
|
|
std::string Addr = "") const;
|
|
const MCSection *CreateSectionForGlobal(const GlobalVariable *GV,
|
|
Mangler *Mang,
|
|
const std::string &Addr = "") const;
|
|
public:
|
|
void SetSectionForGVs(Module &M);
|
|
const std::vector<PIC16Section*> &getBSSSections() const {
|
|
return BSSSections;
|
|
}
|
|
const std::vector<PIC16Section*> &getIDATASections() const {
|
|
return IDATASections;
|
|
}
|
|
const std::vector<PIC16Section*> &getAutosSections() const {
|
|
return AutosSections;
|
|
}
|
|
const std::vector<PIC16Section*> &getROSections() const {
|
|
return ROSections;
|
|
}
|
|
|
|
};
|
|
} // end namespace llvm
|
|
|
|
#endif
|