diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index 6fa41ae67c6..77b5f1c8a3f 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -275,28 +275,100 @@ namespace llvm { MachineLocation Destination; MachineLocation Source; std::vector Values; - public: - MCCFIInstruction(OpType Op, MCSymbol *L) - : Operation(Op), Label(L) { - assert(Op == RememberState || Op == RestoreState); - } - MCCFIInstruction(OpType Op, MCSymbol *L, unsigned Register) - : Operation(Op), Label(L), Destination(Register) { - assert(Op == SameValue || Op == Restore || Op == Undefined); - } - MCCFIInstruction(MCSymbol *L, const MachineLocation &D, - const MachineLocation &S) - : Operation(Move), Label(L), Destination(D), Source(S) { - } MCCFIInstruction(OpType Op, MCSymbol *L, const MachineLocation &D, - const MachineLocation &S) - : Operation(Op), Label(L), Destination(D), Source(S) { - assert(Op == RelMove); + const MachineLocation &S, StringRef V) : + Operation(Op), Label(L), Destination(D), Source(S), + Values(V.begin(), V.end()) { } - MCCFIInstruction(OpType Op, MCSymbol *L, StringRef Vals) - : Operation(Op), Label(L), Values(Vals.begin(), Vals.end()) { - assert(Op == Escape); + + public: + static MCCFIInstruction + createCFIOffset(MCSymbol *L, unsigned Register, int Offset) { + MachineLocation Dest(Register, Offset); + MachineLocation Source(Register, Offset); + + MCCFIInstruction Ret(Move, L, Dest, Source, ""); + return Ret; } + + static MCCFIInstruction + createDefCfaRegister(MCSymbol *L, unsigned Register) { + MachineLocation Dest(Register); + MachineLocation Source(MachineLocation::VirtualFP); + MCCFIInstruction Ret(Move, L, Dest, Source, ""); + return Ret; + } + + static MCCFIInstruction createDefCfaOffset(MCSymbol *L, int Offset) { + MachineLocation Dest(MachineLocation::VirtualFP); + MachineLocation Source(MachineLocation::VirtualFP, -Offset); + MCCFIInstruction Ret(Move, L, Dest, Source, ""); + return Ret; + } + + static MCCFIInstruction + createDefCfa(MCSymbol *L, unsigned Register, int Offset) { + MachineLocation Dest(MachineLocation::VirtualFP); + MachineLocation Source(Register, -Offset); + MCCFIInstruction Ret(Move, L, Dest, Source, ""); + return Ret; + } + + static MCCFIInstruction createUndefined(MCSymbol *L, unsigned Register) { + MachineLocation Dummy; + MachineLocation Dest(Register); + MCCFIInstruction Ret(Undefined, L, Dest, Dummy, ""); + return Ret; + } + + static MCCFIInstruction createRestore(MCSymbol *L, unsigned Register) { + MachineLocation Dummy; + MachineLocation Dest(Register); + MCCFIInstruction Ret(Restore, L, Dest, Dummy, ""); + return Ret; + } + + static MCCFIInstruction createSameValue(MCSymbol *L, unsigned Register) { + MachineLocation Dummy; + MachineLocation Dest(Register); + MCCFIInstruction Ret(SameValue, L, Dest, Dummy, ""); + return Ret; + } + + static MCCFIInstruction createRestoreState(MCSymbol *L) { + MachineLocation Dummy; + MCCFIInstruction Ret(RestoreState, L, Dummy, Dummy, ""); + return Ret; + } + + static MCCFIInstruction createRememberState(MCSymbol *L) { + MachineLocation Dummy; + MCCFIInstruction Ret(RememberState, L, Dummy, Dummy, ""); + return Ret; + } + + static MCCFIInstruction + createRelOffset(MCSymbol *L, unsigned Register, int Offset) { + MachineLocation Dest(Register, Offset); + MachineLocation Source(Register, Offset); + MCCFIInstruction Ret(RelMove, L, Dest, Source, ""); + return Ret; + } + + static MCCFIInstruction + createAdjustCfaOffset(MCSymbol *L, int Adjustment) { + MachineLocation Dest(MachineLocation::VirtualFP); + MachineLocation Source(MachineLocation::VirtualFP, Adjustment); + MCCFIInstruction Ret(RelMove, L, Dest, Source, ""); + return Ret; + } + + static MCCFIInstruction createEscape(MCSymbol *L, StringRef Vals) { + MachineLocation Dummy; + MCCFIInstruction Ret(Escape, L, Dummy, Dummy, Vals); + return Ret; + } + OpType getOperation() const { return Operation; } MCSymbol *getLabel() const { return Label; } const MachineLocation &getDestination() const { return Destination; } diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 85b47fe4379..c9b21e36e51 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -1264,8 +1264,21 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer, TranslateMachineLocation(MRI, Moves[i].getDestination()); const MachineLocation &Src = TranslateMachineLocation(MRI, Moves[i].getSource()); - MCCFIInstruction Inst(Label, Dst, Src); - Instructions.push_back(Inst); + + if (Dst.isReg()) { + assert(Dst.getReg() == MachineLocation::VirtualFP); + assert(!Src.isReg()); + MCCFIInstruction Inst = + MCCFIInstruction::createDefCfa(Label, Src.getReg(), -Src.getOffset()); + Instructions.push_back(Inst); + } else { + assert(Src.isReg()); + unsigned Reg = Src.getReg(); + int Offset = Dst.getOffset(); + MCCFIInstruction Inst = + MCCFIInstruction::createCFIOffset(Label, Reg, Offset); + Instructions.push_back(Inst); + } } EmitCFIInstructions(streamer, Instructions, NULL); diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 02e1028ada9..b8e768cbc87 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -239,9 +239,8 @@ void MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MachineLocation Dest(MachineLocation::VirtualFP); - MachineLocation Source(Register, -Offset); - MCCFIInstruction Instruction(Label, Dest, Source); + MCCFIInstruction Instruction = + MCCFIInstruction::createDefCfa(Label, Register, Offset); CurFrame->Instructions.push_back(Instruction); } @@ -250,9 +249,8 @@ void MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MachineLocation Dest(MachineLocation::VirtualFP); - MachineLocation Source(MachineLocation::VirtualFP, -Offset); - MCCFIInstruction Instruction(Label, Dest, Source); + MCCFIInstruction Instruction = + MCCFIInstruction::createDefCfaOffset(Label, Offset); CurFrame->Instructions.push_back(Instruction); } @@ -261,9 +259,8 @@ void MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MachineLocation Dest(MachineLocation::VirtualFP); - MachineLocation Source(MachineLocation::VirtualFP, Adjustment); - MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source); + MCCFIInstruction Instruction = + MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment); CurFrame->Instructions.push_back(Instruction); } @@ -272,9 +269,8 @@ void MCStreamer::EmitCFIDefCfaRegister(int64_t Register) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MachineLocation Dest(Register); - MachineLocation Source(MachineLocation::VirtualFP); - MCCFIInstruction Instruction(Label, Dest, Source); + MCCFIInstruction Instruction = + MCCFIInstruction::createDefCfaRegister(Label, Register); CurFrame->Instructions.push_back(Instruction); } @@ -283,9 +279,8 @@ void MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MachineLocation Dest(Register, Offset); - MachineLocation Source(Register, Offset); - MCCFIInstruction Instruction(Label, Dest, Source); + MCCFIInstruction Instruction = + MCCFIInstruction::createCFIOffset(Label, Register, Offset); CurFrame->Instructions.push_back(Instruction); } @@ -294,9 +289,8 @@ void MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MachineLocation Dest(Register, Offset); - MachineLocation Source(Register, Offset); - MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source); + MCCFIInstruction Instruction = + MCCFIInstruction::createRelOffset(Label, Register, Offset); CurFrame->Instructions.push_back(Instruction); } @@ -320,7 +314,7 @@ void MCStreamer::EmitCFIRememberState() { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::RememberState, Label); + MCCFIInstruction Instruction = MCCFIInstruction::createRememberState(Label); CurFrame->Instructions.push_back(Instruction); } @@ -330,7 +324,7 @@ void MCStreamer::EmitCFIRestoreState() { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::RestoreState, Label); + MCCFIInstruction Instruction = MCCFIInstruction::createRestoreState(Label); CurFrame->Instructions.push_back(Instruction); } @@ -339,7 +333,8 @@ void MCStreamer::EmitCFISameValue(int64_t Register) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::SameValue, Label, Register); + MCCFIInstruction Instruction = + MCCFIInstruction::createSameValue(Label, Register); CurFrame->Instructions.push_back(Instruction); } @@ -348,7 +343,8 @@ void MCStreamer::EmitCFIRestore(int64_t Register) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::Restore, Label, Register); + MCCFIInstruction Instruction = + MCCFIInstruction::createRestore(Label, Register); CurFrame->Instructions.push_back(Instruction); } @@ -357,7 +353,7 @@ void MCStreamer::EmitCFIEscape(StringRef Values) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::Escape, Label, Values); + MCCFIInstruction Instruction = MCCFIInstruction::createEscape(Label, Values); CurFrame->Instructions.push_back(Instruction); } @@ -372,7 +368,8 @@ void MCStreamer::EmitCFIUndefined(int64_t Register) { MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); MCSymbol *Label = getContext().CreateTempSymbol(); EmitLabel(Label); - MCCFIInstruction Instruction(MCCFIInstruction::Undefined, Label, Register); + MCCFIInstruction Instruction = + MCCFIInstruction::createUndefined(Label, Register); CurFrame->Instructions.push_back(Instruction); }