mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 16:19:52 +00:00
This starts merging MCSection and MCSectionData. There are a few issues with the current split between MCSection and MCSectionData. * It optimizes the the not as important case. We want the production of .o files to be really fast, but the split puts the information used for .o emission in a separate data structure. * The ELF/COFF/MachO hierarchy is not represented in MCSectionData, leading to some ad-hoc ways to represent the various flags. * It makes it harder to remember where each item is. The attached patch starts merging the two by moving the alignment from MCSectionData to MCSection. Most of the patch is actually just dropping 'const', since MCSectionData is mutable, but MCSection was not. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237936 91177308-0d34-0410-b5e6-96231b3b80d8
85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
//===- MCSection.h - Machine Code Sections ----------------------*- 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 MCSection class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_MC_MCSECTION_H
|
|
#define LLVM_MC_MCSECTION_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/MC/SectionKind.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
|
|
namespace llvm {
|
|
class MCAsmInfo;
|
|
class MCContext;
|
|
class MCExpr;
|
|
class MCSymbol;
|
|
class raw_ostream;
|
|
|
|
/// Instances of this class represent a uniqued identifier for a section in the
|
|
/// current translation unit. The MCContext class uniques and creates these.
|
|
class MCSection {
|
|
public:
|
|
enum SectionVariant { SV_COFF = 0, SV_ELF, SV_MachO };
|
|
|
|
private:
|
|
MCSection(const MCSection &) = delete;
|
|
void operator=(const MCSection &) = delete;
|
|
|
|
MCSymbol *Begin;
|
|
MCSymbol *End;
|
|
/// The alignment requirement of this section.
|
|
unsigned Alignment;
|
|
|
|
protected:
|
|
MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin)
|
|
: Begin(Begin), End(nullptr), Alignment(1), Variant(V), Kind(K) {}
|
|
SectionVariant Variant;
|
|
SectionKind Kind;
|
|
|
|
public:
|
|
virtual ~MCSection();
|
|
|
|
SectionKind getKind() const { return Kind; }
|
|
|
|
SectionVariant getVariant() const { return Variant; }
|
|
|
|
MCSymbol *getBeginSymbol() { return Begin; }
|
|
const MCSymbol *getBeginSymbol() const {
|
|
return const_cast<MCSection *>(this)->getBeginSymbol();
|
|
}
|
|
void setBeginSymbol(MCSymbol *Sym) {
|
|
assert(!Begin);
|
|
Begin = Sym;
|
|
}
|
|
MCSymbol *getEndSymbol(MCContext &Ctx);
|
|
bool hasEnded() const;
|
|
|
|
unsigned getAlignment() const { return Alignment; }
|
|
void setAlignment(unsigned Value) { Alignment = Value; }
|
|
|
|
virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS,
|
|
const MCExpr *Subsection) const = 0;
|
|
|
|
/// Return true if a .align directive should use "optimized nops" to fill
|
|
/// instead of 0s.
|
|
virtual bool UseCodeAlign() const = 0;
|
|
|
|
/// Check whether this section is "virtual", that is has no actual object
|
|
/// file contents.
|
|
virtual bool isVirtualSection() const = 0;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|