mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 06:30:39 +00:00
Factor a bit of code to MCStreamer::EmitLabel. Keep track of the last
non private symbol. This will be use for handling foo: .cfi_startproc ... On OS X where we have to create a foo.eh symbol. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130305 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
089a246333
commit
ed708f9c1f
@ -263,12 +263,13 @@ namespace llvm {
|
||||
|
||||
struct MCDwarfFrameInfo {
|
||||
MCDwarfFrameInfo() : Begin(0), End(0), Personality(0), Lsda(0),
|
||||
Instructions(), PersonalityEncoding(0),
|
||||
Function(0), Instructions(), PersonalityEncoding(),
|
||||
LsdaEncoding(0) {}
|
||||
MCSymbol *Begin;
|
||||
MCSymbol *End;
|
||||
const MCSymbol *Personality;
|
||||
const MCSymbol *Lsda;
|
||||
const MCSymbol *Function;
|
||||
std::vector<MCCFIInstruction> Instructions;
|
||||
unsigned PersonalityEncoding;
|
||||
unsigned LsdaEncoding;
|
||||
|
@ -57,6 +57,8 @@ namespace llvm {
|
||||
MCDwarfFrameInfo *getCurrentFrameInfo();
|
||||
void EnsureValidFrame();
|
||||
|
||||
const MCSymbol* LastNonPrivate;
|
||||
|
||||
/// SectionStack - This is stack of current and previous section
|
||||
/// values saved by PushSection.
|
||||
SmallVector<std::pair<const MCSection *,
|
||||
@ -180,7 +182,7 @@ namespace llvm {
|
||||
/// @param Symbol - The symbol to emit. A given symbol should only be
|
||||
/// emitted as a label once, and symbols emitted as a label should never be
|
||||
/// used in an assignment.
|
||||
virtual void EmitLabel(MCSymbol *Symbol) = 0;
|
||||
virtual void EmitLabel(MCSymbol *Symbol);
|
||||
|
||||
/// EmitAssemblerFlag - Note in the output the specified @p Flag
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0;
|
||||
|
@ -278,12 +278,10 @@ void MCAsmStreamer::ChangeSection(const MCSection *Section) {
|
||||
|
||||
void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {
|
||||
assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
|
||||
assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
|
||||
assert(getCurrentSection() && "Cannot emit before setting section!");
|
||||
MCStreamer::EmitLabel(Symbol);
|
||||
|
||||
OS << *Symbol << MAI.getLabelSuffix();
|
||||
EmitEOL();
|
||||
Symbol->setSection(*getCurrentSection());
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
|
@ -107,10 +107,7 @@ void MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
|
||||
}
|
||||
|
||||
void MCObjectStreamer::EmitLabel(MCSymbol *Symbol) {
|
||||
assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
|
||||
assert(getCurrentSection() && "Cannot emit before setting section!");
|
||||
|
||||
Symbol->setSection(*getCurrentSection());
|
||||
MCStreamer::EmitLabel(Symbol);
|
||||
|
||||
MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
@ -153,12 +154,23 @@ void MCStreamer::EnsureValidFrame() {
|
||||
report_fatal_error("No open frame");
|
||||
}
|
||||
|
||||
void MCStreamer::EmitLabel(MCSymbol *Symbol) {
|
||||
assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
|
||||
assert(getCurrentSection() && "Cannot emit before setting section!");
|
||||
Symbol->setSection(*getCurrentSection());
|
||||
|
||||
StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix();
|
||||
if (!Symbol->getName().startswith(Prefix))
|
||||
LastNonPrivate = Symbol;
|
||||
}
|
||||
|
||||
void MCStreamer::EmitCFIStartProc() {
|
||||
MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
|
||||
if (CurFrame && !CurFrame->End)
|
||||
report_fatal_error("Starting a frame before finishing the previous one!");
|
||||
MCDwarfFrameInfo Frame;
|
||||
Frame.Begin = getContext().CreateTempSymbol();
|
||||
Frame.Function = LastNonPrivate;
|
||||
EmitLabel(Frame.Begin);
|
||||
FrameInfos.push_back(Frame);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user