From 8f7d12ccfd8feb258bdf4e582592bc00beacc7c6 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 17 Dec 2011 01:14:52 +0000 Subject: Add back the MC bits of 126425. Original patch by Nathan Jeffords. I added the asm parsing and testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146801 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 60a0a9d..74c3e39 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -558,6 +558,10 @@ void MCStreamer::EmitWin64EHEndProlog() { EmitLabel(CurFrame->PrologEnd); } +void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { + assert(0 && "This file format doesn't support this directive"); +} + void MCStreamer::EmitFnStart() { errs() << "Not implemented yet\n"; abort(); -- cgit v1.1 From 6f0b181bc70318f8d5d4b9bdead7fc748677fe2a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 29 Dec 2011 20:24:47 +0000 Subject: Implement .cfi_escape. Patch by Brian Anderson! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147352 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 74c3e39..23d8c1c 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -408,6 +408,15 @@ void MCStreamer::EmitCFISameValue(int64_t 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::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) { W64UnwindInfos.push_back(Frame); CurrentW64UnwindInfo = W64UnwindInfos.back(); -- cgit v1.1 From c25680f728f89dd43939b00049ee524fbf59b7be Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 29 Dec 2011 21:09:08 +0000 Subject: Rename Remember and Restore to RememberState and RestoreState for consistency. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147354 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 23d8c1c..4169188 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -385,7 +385,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); } @@ -395,7 +395,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); } -- cgit v1.1 From ed23bdb65fe86cdb7a38c8c1998ec965e6973966 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 29 Dec 2011 21:43:03 +0000 Subject: Implement cfi_restore. Patch by Brian Anderson! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147356 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 4169188..8567941 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -408,6 +408,15 @@ 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(); -- cgit v1.1 From 99b4237c1647156f0e1d3d7e03efdab23ed79778 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 7 Jan 2012 03:13:18 +0000 Subject: Split Finish into Finish and FinishImpl to have a common place to do end of file error checking. Use that to error on an unfinished cfi_startproc. The error is not nice, but is already better than a segmentation fault. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147717 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 8567941..ce9de9d 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -652,3 +652,10 @@ void MCStreamer::EmitW64Tables() { MCWin64EHUnwindEmitter::Emit(*this); } + +void MCStreamer::Finish() { + if (!FrameInfos.empty() && !FrameInfos.back().End) + report_fatal_error("Unfinished frame!"); + + FinishImpl(); +} -- cgit v1.1 From 547be2699c547b79a7735858a64921d8ccf180f7 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 7 Jan 2012 22:42:19 +0000 Subject: Don't print a label before .cfi_startproc when we don't need to. This makes the produce assembly when using CFI just a bit more readable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147743 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index ce9de9d..145489a 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -276,8 +276,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(); @@ -287,9 +296,6 @@ void MCStreamer::EmitCFIStartProc() { Frame.Begin = getContext().CreateTempSymbol(); EmitLabel(Frame.Begin); } - - FrameInfos.push_back(Frame); - RegionIndicator = Code; } void MCStreamer::EmitCFIEndProc() { -- cgit v1.1 From 1fe9737eb49ecb80fbb547f0e16e10a726cd53cf Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 9 Jan 2012 00:17:29 +0000 Subject: Don't print an unused label before .cfi_endproc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147763 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 145489a..7bbb379 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -301,8 +301,15 @@ void MCStreamer::RecordProcStart(MCDwarfFrameInfo &Frame) { 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) { -- cgit v1.1 From 16d7d437e03ce87fdaef7971919302920d54a966 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 23 Jan 2012 21:51:52 +0000 Subject: Add support for .cfi_signal_frame. Fixes pr11762. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148733 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 7bbb379..1690eea 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -439,6 +439,12 @@ void MCStreamer::EmitCFIEscape(StringRef 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(); -- cgit v1.1 From 6c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Fri, 3 Feb 2012 04:33:00 +0000 Subject: Add a new MachineJumpTableInfo entry type, EK_GPRel64BlockAddress, which is needed to emit a 64-bit gp-relative relocation entry. Make changes necessary for emitting jump tables which have entries with directive .gpdword. This patch does not implement the parts needed for direct object emission or JIT. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149668 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 1690eea..50a5f8d 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -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"); } -- cgit v1.1 From 858143816d43e58b17bfd11cb1b57afbd7f0f893 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 7 Feb 2012 05:05:23 +0000 Subject: Convert assert(0) to llvm_unreachable git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149967 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 50a5f8d..6d53fb1 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -600,7 +600,7 @@ void MCStreamer::EmitWin64EHEndProlog() { } void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { - assert(0 && "This file format doesn't support this directive"); + llvm_unreachable("This file format doesn't support this directive"); } void MCStreamer::EmitFnStart() { -- cgit v1.1 From b601ab5cce6c560dff365cd87f6854ea95f76f54 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 23 Feb 2012 21:15:21 +0000 Subject: Bump SmallString to the minimum required amount for raw_ostream to avoid allocation. It's is a bit annoying, we should hide this implementation detail better. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151284 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCStreamer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/MC/MCStreamer.cpp') diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 6d53fb1..43e62ff 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -95,7 +95,7 @@ void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size, /// client having to pass in a MCExpr for constant integers. void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace, unsigned Padding) { - SmallString<32> Tmp; + SmallString<128> Tmp; raw_svector_ostream OSE(Tmp); MCObjectWriter::EncodeULEB128(Value, OSE, Padding); EmitBytes(OSE.str(), AddrSpace); @@ -104,7 +104,7 @@ void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned 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); -- cgit v1.1