mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
ecd541affd
EmitLabel() llvm-svn: 80677
154 lines
4.8 KiB
C++
154 lines
4.8 KiB
C++
//===--- lib/CodeGen/DwarfPrinter.h - Dwarf Printer -------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Emit general DWARF directives.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef CODEGEN_ASMPRINTER_DWARFPRINTER_H__
|
|
#define CODEGEN_ASMPRINTER_DWARFPRINTER_H__
|
|
|
|
#include "DwarfLabel.h"
|
|
#include "llvm/CodeGen/MachineLocation.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class AsmPrinter;
|
|
class MachineFunction;
|
|
class MachineModuleInfo;
|
|
class Module;
|
|
class MCAsmInfo;
|
|
class TargetData;
|
|
class TargetRegisterInfo;
|
|
|
|
class VISIBILITY_HIDDEN Dwarf {
|
|
protected:
|
|
//===-------------------------------------------------------------==---===//
|
|
// Core attributes used by the DWARF printer.
|
|
//
|
|
|
|
/// O - Stream to .s file.
|
|
///
|
|
raw_ostream &O;
|
|
|
|
/// Asm - Target of Dwarf emission.
|
|
///
|
|
AsmPrinter *Asm;
|
|
|
|
/// MAI - Target asm information.
|
|
///
|
|
const MCAsmInfo *MAI;
|
|
|
|
/// TD - Target data.
|
|
///
|
|
const TargetData *TD;
|
|
|
|
/// RI - Register Information.
|
|
///
|
|
const TargetRegisterInfo *RI;
|
|
|
|
/// M - Current module.
|
|
///
|
|
Module *M;
|
|
|
|
/// MF - Current machine function.
|
|
///
|
|
MachineFunction *MF;
|
|
|
|
/// MMI - Collected machine module information.
|
|
///
|
|
MachineModuleInfo *MMI;
|
|
|
|
/// SubprogramCount - The running count of functions being compiled.
|
|
///
|
|
unsigned SubprogramCount;
|
|
|
|
/// Flavor - A unique string indicating what dwarf producer this is, used to
|
|
/// unique labels.
|
|
///
|
|
const char * const Flavor;
|
|
|
|
/// SetCounter - A unique number for each '.set' directive.
|
|
///
|
|
unsigned SetCounter;
|
|
|
|
Dwarf(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T,
|
|
const char *flavor);
|
|
public:
|
|
//===------------------------------------------------------------------===//
|
|
// Accessors.
|
|
//
|
|
const AsmPrinter *getAsm() const { return Asm; }
|
|
MachineModuleInfo *getMMI() const { return MMI; }
|
|
const MCAsmInfo *getMCAsmInfo() const { return MAI; }
|
|
const TargetData *getTargetData() const { return TD; }
|
|
|
|
void PrintRelDirective(bool Force32Bit = false,
|
|
bool isInSection = false) const;
|
|
|
|
|
|
/// PrintLabelName - Print label name in form used by Dwarf writer.
|
|
///
|
|
void PrintLabelName(const DWLabel &Label) const {
|
|
PrintLabelName(Label.getTag(), Label.getNumber());
|
|
}
|
|
void PrintLabelName(const char *Tag, unsigned Number) const;
|
|
void PrintLabelName(const char *Tag, unsigned Number,
|
|
const char *Suffix) const;
|
|
|
|
/// EmitLabel - Emit location label for internal use by Dwarf.
|
|
///
|
|
void EmitLabel(const DWLabel &Label) const {
|
|
EmitLabel(Label.getTag(), Label.getNumber());
|
|
}
|
|
void EmitLabel(const char *Tag, unsigned Number) const;
|
|
|
|
/// EmitReference - Emit a reference to a label.
|
|
///
|
|
void EmitReference(const DWLabel &Label, bool IsPCRelative = false,
|
|
bool Force32Bit = false) const {
|
|
EmitReference(Label.getTag(), Label.getNumber(),
|
|
IsPCRelative, Force32Bit);
|
|
}
|
|
void EmitReference(const char *Tag, unsigned Number,
|
|
bool IsPCRelative = false,
|
|
bool Force32Bit = false) const;
|
|
void EmitReference(const std::string &Name, bool IsPCRelative = false,
|
|
bool Force32Bit = false) const;
|
|
|
|
/// EmitDifference - Emit the difference between two labels. Some
|
|
/// assemblers do not behave with absolute expressions with data directives,
|
|
/// so there is an option (needsSet) to use an intermediary set expression.
|
|
void EmitDifference(const DWLabel &LabelHi, const DWLabel &LabelLo,
|
|
bool IsSmall = false) {
|
|
EmitDifference(LabelHi.getTag(), LabelHi.getNumber(),
|
|
LabelLo.getTag(), LabelLo.getNumber(),
|
|
IsSmall);
|
|
}
|
|
void EmitDifference(const char *TagHi, unsigned NumberHi,
|
|
const char *TagLo, unsigned NumberLo,
|
|
bool IsSmall = false);
|
|
|
|
void EmitSectionOffset(const char* Label, const char* Section,
|
|
unsigned LabelNumber, unsigned SectionNumber,
|
|
bool IsSmall = false, bool isEH = false,
|
|
bool useSet = true);
|
|
|
|
/// EmitFrameMoves - Emit frame instructions to describe the layout of the
|
|
/// frame.
|
|
void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
|
|
const std::vector<MachineMove> &Moves, bool isEH);
|
|
};
|
|
|
|
} // end llvm namespace
|
|
|
|
#endif
|