mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
This commit does not complete the type units feature - there are issues around fission support (skeletal type units, pubtypes/pubnames) and hashing of some types including those containing references to types in other type units. Originally committed as r197073 and reverted in r197079. Recommitted as r197197 to reproduce the failure and reverted as r197199 Turns out there was unstable ordering in the type unit dumping code. Fixed by using MapVector in DWARFContext to store the debug_types comdat sections. Recommitted as r197210 with a fix to dumping and reverted as r197211 because I was a bit gun shy and thought I saw a failure that turned out to be unrelated. So here we go - once more with feeling! \o/ git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197275 91177308-0d34-0410-b5e6-96231b3b80d8
102 lines
3.3 KiB
C++
102 lines
3.3 KiB
C++
//===- MCSectionELF.h - ELF 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 MCSectionELF class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_MC_MCSECTIONELF_H
|
|
#define LLVM_MC_MCSECTIONELF_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/MC/MCSection.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/ELF.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace llvm {
|
|
|
|
class MCSymbol;
|
|
|
|
/// MCSectionELF - This represents a section on linux, lots of unix variants
|
|
/// and some bare metal systems.
|
|
class MCSectionELF : public MCSection {
|
|
/// SectionName - This is the name of the section. The referenced memory is
|
|
/// owned by TargetLoweringObjectFileELF's ELFUniqueMap.
|
|
StringRef SectionName;
|
|
|
|
/// Type - This is the sh_type field of a section, drawn from the enums below.
|
|
unsigned Type;
|
|
|
|
/// Flags - This is the sh_flags field of a section, drawn from the enums.
|
|
/// below.
|
|
unsigned Flags;
|
|
|
|
/// EntrySize - The size of each entry in this section. This size only
|
|
/// makes sense for sections that contain fixed-sized entries. If a
|
|
/// section does not contain fixed-sized entries 'EntrySize' will be 0.
|
|
unsigned EntrySize;
|
|
|
|
const MCSymbol *Group;
|
|
|
|
private:
|
|
friend class MCContext;
|
|
MCSectionELF(StringRef Section, unsigned type, unsigned flags,
|
|
SectionKind K, unsigned entrySize, const MCSymbol *group)
|
|
: MCSection(SV_ELF, K), SectionName(Section), Type(type), Flags(flags),
|
|
EntrySize(entrySize), Group(group) {}
|
|
~MCSectionELF();
|
|
public:
|
|
|
|
/// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
|
/// should be printed before the section name
|
|
bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
|
|
|
|
StringRef getSectionName() const { return SectionName; }
|
|
virtual std::string getLabelBeginName() const {
|
|
if (Group)
|
|
return (SectionName.str() + '_' + Group->getName() + "_begin").str();
|
|
return SectionName.str() + "_begin";
|
|
}
|
|
virtual std::string getLabelEndName() const {
|
|
if (Group)
|
|
return (SectionName.str() + '_' + Group->getName() + "_end").str();
|
|
return SectionName.str() + "_end";
|
|
}
|
|
unsigned getType() const { return Type; }
|
|
unsigned getFlags() const { return Flags; }
|
|
unsigned getEntrySize() const { return EntrySize; }
|
|
const MCSymbol *getGroup() const { return Group; }
|
|
|
|
void PrintSwitchToSection(const MCAsmInfo &MAI,
|
|
raw_ostream &OS,
|
|
const MCExpr *Subsection) const;
|
|
virtual bool UseCodeAlign() const;
|
|
virtual bool isVirtualSection() const;
|
|
|
|
/// isBaseAddressKnownZero - We know that non-allocatable sections (like
|
|
/// debug info) have a base of zero.
|
|
virtual bool isBaseAddressKnownZero() const {
|
|
return (getFlags() & ELF::SHF_ALLOC) == 0;
|
|
}
|
|
|
|
static bool classof(const MCSection *S) {
|
|
return S->getVariant() == SV_ELF;
|
|
}
|
|
|
|
// Return the entry size for sections with fixed-width data.
|
|
static unsigned DetermineEntrySize(SectionKind Kind);
|
|
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|