diff options
Diffstat (limited to 'lib/MC/MCStreamer.cpp')
-rw-r--r-- | lib/MC/MCStreamer.cpp | 109 |
1 files changed, 80 insertions, 29 deletions
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 3afa22b..43e62ff 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -16,7 +16,6 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" #include "llvm/ADT/SmallString.h" -#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" #include <cstdlib> using namespace llvm; @@ -94,17 +93,18 @@ void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size, /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the /// client having to pass in a MCExpr for constant integers. -void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace) { - SmallString<32> Tmp; +void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace, + unsigned Padding) { + SmallString<128> Tmp; raw_svector_ostream OSE(Tmp); - MCObjectWriter::EncodeULEB128(Value, OSE); + MCObjectWriter::EncodeULEB128(Value, OSE, Padding); EmitBytes(OSE.str(), AddrSpace); } /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the /// client having to pass in a MCExpr for constant integers. void MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) { - SmallString<32> Tmp; + SmallString<128> Tmp; raw_svector_ostream OSE(Tmp); MCObjectWriter::EncodeSLEB128(Value, OSE); EmitBytes(OSE.str(), AddrSpace); @@ -128,6 +128,10 @@ void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size, AddrSpace); } +void MCStreamer::EmitGPRel64Value(const MCExpr *Value) { + report_fatal_error("unsupported directive in streamer"); +} + void MCStreamer::EmitGPRel32Value(const MCExpr *Value) { report_fatal_error("unsupported directive in streamer"); } @@ -142,8 +146,9 @@ void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, } bool MCStreamer::EmitDwarfFileDirective(unsigned FileNo, + StringRef Directory, StringRef Filename) { - return getContext().GetDwarfFile(Filename, FileNo) == 0; + return getContext().GetDwarfFile(Directory, Filename, FileNo) == 0; } void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, @@ -186,9 +191,8 @@ void MCStreamer::EmitDataRegion() { if (!MAI.getSupportsDataRegions()) return; // Generate a unique symbol name. - MCSymbol *NewSym = Context.GetOrCreateSymbol( - Twine(MAI.getDataBeginLabelName()) + - utostr(UniqueDataBeginSuffix++)); + MCSymbol *NewSym = Context.GetOrCreateSymbol(MAI.getDataBeginLabelName() + + Twine(UniqueDataBeginSuffix++)); EmitLabel(NewSym); RegionIndicator = Data; @@ -202,9 +206,8 @@ void MCStreamer::EmitCodeRegion() { if (!MAI.getSupportsDataRegions()) return; // Generate a unique symbol name. - MCSymbol *NewSym = Context.GetOrCreateSymbol( - Twine(MAI.getCodeBeginLabelName()) + - utostr(UniqueCodeBeginSuffix++)); + MCSymbol *NewSym = Context.GetOrCreateSymbol(MAI.getCodeBeginLabelName() + + Twine(UniqueCodeBeginSuffix++)); EmitLabel(NewSym); RegionIndicator = Code; @@ -218,9 +221,9 @@ void MCStreamer::EmitJumpTable8Region() { if (!MAI.getSupportsDataRegions()) return; // Generate a unique symbol name. - MCSymbol *NewSym = Context.GetOrCreateSymbol( - Twine(MAI.getJumpTable8BeginLabelName()) + - utostr(UniqueDataBeginSuffix++)); + MCSymbol *NewSym = + Context.GetOrCreateSymbol(MAI.getJumpTable8BeginLabelName() + + Twine(UniqueDataBeginSuffix++)); EmitLabel(NewSym); RegionIndicator = JumpTable8; @@ -234,9 +237,9 @@ void MCStreamer::EmitJumpTable16Region() { if (!MAI.getSupportsDataRegions()) return; // Generate a unique symbol name. - MCSymbol *NewSym = Context.GetOrCreateSymbol( - Twine(MAI.getJumpTable16BeginLabelName()) + - utostr(UniqueDataBeginSuffix++)); + MCSymbol *NewSym = + Context.GetOrCreateSymbol(MAI.getJumpTable16BeginLabelName() + + Twine(UniqueDataBeginSuffix++)); EmitLabel(NewSym); RegionIndicator = JumpTable16; @@ -251,9 +254,9 @@ void MCStreamer::EmitJumpTable32Region() { if (!MAI.getSupportsDataRegions()) return; // Generate a unique symbol name. - MCSymbol *NewSym = Context.GetOrCreateSymbol( - Twine(MAI.getJumpTable32BeginLabelName()) + - utostr(UniqueDataBeginSuffix++)); + MCSymbol *NewSym = + Context.GetOrCreateSymbol(MAI.getJumpTable32BeginLabelName() + + Twine(UniqueDataBeginSuffix++)); EmitLabel(NewSym); RegionIndicator = JumpTable32; @@ -277,8 +280,17 @@ void MCStreamer::EmitCFIStartProc() { report_fatal_error("Starting a frame before finishing the previous one!"); MCDwarfFrameInfo Frame; - Frame.Function = LastSymbol; + EmitCFIStartProcImpl(Frame); + FrameInfos.push_back(Frame); + RegionIndicator = Code; +} + +void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { +} + +void MCStreamer::RecordProcStart(MCDwarfFrameInfo &Frame) { + Frame.Function = LastSymbol; // If the function is externally visible, we need to create a local // symbol to avoid relocations. StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix(); @@ -288,16 +300,20 @@ void MCStreamer::EmitCFIStartProc() { Frame.Begin = getContext().CreateTempSymbol(); EmitLabel(Frame.Begin); } - - FrameInfos.push_back(Frame); - RegionIndicator = Code; } void MCStreamer::EmitCFIEndProc() { EnsureValidFrame(); MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); - CurFrame->End = getContext().CreateTempSymbol(); - EmitLabel(CurFrame->End); + EmitCFIEndProcImpl(*CurFrame); +} + +void MCStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { +} + +void MCStreamer::RecordProcEnd(MCDwarfFrameInfo &Frame) { + Frame.End = getContext().CreateTempSymbol(); + EmitLabel(Frame.End); } void MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) { @@ -386,7 +402,7 @@ void MCStreamer::EmitCFIRememberState() { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::Remember, Label); + MCCFIInstruction Instruction(MCCFIInstruction::RememberState, Label); CurFrame->Instructions.push_back(Instruction); } @@ -396,7 +412,7 @@ void MCStreamer::EmitCFIRestoreState() { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::Restore, Label); + MCCFIInstruction Instruction(MCCFIInstruction::RestoreState, Label); CurFrame->Instructions.push_back(Instruction); } @@ -409,6 +425,30 @@ void MCStreamer::EmitCFISameValue(int64_t Register) { CurFrame->Instructions.push_back(Instruction); } +void MCStreamer::EmitCFIRestore(int64_t Register) { + EnsureValidFrame(); + MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); + MCSymbol *Label = getContext().CreateTempSymbol(); + EmitLabel(Label); + MCCFIInstruction Instruction(MCCFIInstruction::Restore, Label, Register); + CurFrame->Instructions.push_back(Instruction); +} + +void MCStreamer::EmitCFIEscape(StringRef Values) { + EnsureValidFrame(); + MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); + MCSymbol *Label = getContext().CreateTempSymbol(); + EmitLabel(Label); + MCCFIInstruction Instruction(MCCFIInstruction::Escape, Label, Values); + CurFrame->Instructions.push_back(Instruction); +} + +void MCStreamer::EmitCFISignalFrame() { + EnsureValidFrame(); + MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); + CurFrame->IsSignalFrame = true; +} + void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) { W64UnwindInfos.push_back(Frame); CurrentW64UnwindInfo = W64UnwindInfos.back(); @@ -559,6 +599,10 @@ void MCStreamer::EmitWin64EHEndProlog() { EmitLabel(CurFrame->PrologEnd); } +void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { + llvm_unreachable("This file format doesn't support this directive"); +} + void MCStreamer::EmitFnStart() { errs() << "Not implemented yet\n"; abort(); @@ -631,3 +675,10 @@ void MCStreamer::EmitW64Tables() { MCWin64EHUnwindEmitter::Emit(*this); } + +void MCStreamer::Finish() { + if (!FrameInfos.empty() && !FrameInfos.back().End) + report_fatal_error("Unfinished frame!"); + + FinishImpl(); +} |