[PATCH] [MC] Use the non-EH register mapping in the debug_frame section.

Rafael Espíndola rafael.espindola at gmail.com
Tue Feb 24 08:10:09 PST 2015


Anything blocking this?
On Feb 12, 2015 5:46 PM, "Jim Grosbach" <grosbach at apple.com> wrote:

> Fair enough. Works for me.
>
> -Jim
>
> > On Feb 12, 2015, at 1:52 PM, Frédéric Riss <friss at apple.com> wrote:
> >
> >
> >> On Feb 12, 2015, at 1:22 PM, Jim Grosbach <grosbach at apple.com> wrote:
> >>
> >> Oof. The patch itself seems reasonable. I tend to agree with your
> thought that it may not be a root cause. Do you have any ideas about what a
> deeper solution would look like?
> >
> > I guess there is no deeper solution. Storing the LLVM regnum in the CFI
> instruction would be marginally cleaner as it’s supposed to be more
> ‘canonical’, and it would need to be converted only once. You’d still have
> to make an arbitrary choice when emitting .cfi directives in AsmStreamer.
> They are used for both EH and standard frame info, but they take only one
> argument. This usecase really only works when both mapping are identical.
> >
> > As Rafael put it in another reply, we have to choose one number to
> represent the register anyway. The EH number is the most used one, thus
> it’s not a bad choice.
> >
> > Fred
> >
> >> -Jim
> >>
> >>> On Feb 12, 2015, at 8:32 AM, Frederic Riss <friss at apple.com> wrote:
> >>>
> >>> Hi grosbach,
> >>>
> >>> On 32bits x86 Darwin, the register mappings for the eh_frane and
> >>> debug_frame sections are different. Thus the same CFI instructions
> >>> should result in different registers in the object file. The
> >>> problem isn't target specific though, but it requires that the
> >>> mappings for EH register numbers be different from the standard
> >>> Dwarf one.
> >>>
> >>> The patch is really ugly. The CFI instructions are emitted with
> >>> register operands that are already Dwarf EH register numbers,
> >>> allthough they will be used to emit both EH and non-EH frame
> >>> descriptions. I first thought the right solution was to encode
> >>> LLVM register numbers in the CFI instructions and do the
> >>> conversion at object emission time. This however breaks a lot
> >>> of tests that where the .cfi_* asm directives are tested (which
> >>> means it would break targets not using the integrated assembler).
> >>>
> >>> What this patch does instead is to do a double conversion when
> >>> emitting the debug_frame section. Knowing the CFI instruction
> >>> references EH reg numbers, it converts them back to LLVM reg num
> >>> and again back to the correct Dwarf mapping.
> >>>
> >>> I'll add a test, but I first wanted to reach out for opinions
> >>> as this looks like a bandaid rahter than a fix.
> >>>
> >>> Fixes PR22363.
> >>>
> >>> http://reviews.llvm.org/D7593
> >>>
> >>> Files:
> >>> lib/MC/MCDwarf.cpp
> >>>
> >>> Index: lib/MC/MCDwarf.cpp
> >>> ===================================================================
> >>> --- lib/MC/MCDwarf.cpp
> >>> +++ lib/MC/MCDwarf.cpp
> >>> @@ -1045,11 +1045,16 @@
> >>> void FrameEmitterImpl::EmitCFIInstruction(MCObjectStreamer &Streamer,
> >>>                                         const MCCFIInstruction &Instr)
> {
> >>> int dataAlignmentFactor = getDataAlignmentFactor(Streamer);
> >>> +  auto *MRI = Streamer.getContext().getRegisterInfo();
> >>>
> >>> switch (Instr.getOperation()) {
> >>> case MCCFIInstruction::OpRegister: {
> >>>   unsigned Reg1 = Instr.getRegister();
> >>>   unsigned Reg2 = Instr.getRegister2();
> >>> +    if (!IsEH) {
> >>> +      Reg1 = MRI->getDwarfRegNum(MRI->getLLVMRegNum(Reg1, true),
> false);
> >>> +      Reg2 = MRI->getDwarfRegNum(MRI->getLLVMRegNum(Reg2, true),
> false);
> >>> +    }
> >>>   Streamer.EmitIntValue(dwarf::DW_CFA_register, 1);
> >>>   Streamer.EmitULEB128IntValue(Reg1);
> >>>   Streamer.EmitULEB128IntValue(Reg2);
> >>> @@ -1082,17 +1087,23 @@
> >>>   return;
> >>> }
> >>> case MCCFIInstruction::OpDefCfa: {
> >>> +    unsigned Reg = Instr.getRegister();
> >>> +    if (!IsEH)
> >>> +      Reg = MRI->getDwarfRegNum(MRI->getLLVMRegNum(Reg, true), false);
> >>>   Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa, 1);
> >>> -    Streamer.EmitULEB128IntValue(Instr.getRegister());
> >>> +    Streamer.EmitULEB128IntValue(Reg);
> >>>   CFAOffset = -Instr.getOffset();
> >>>   Streamer.EmitULEB128IntValue(CFAOffset);
> >>>
> >>>   return;
> >>> }
> >>>
> >>> case MCCFIInstruction::OpDefCfaRegister: {
> >>> +    unsigned Reg = Instr.getRegister();
> >>> +    if (!IsEH)
> >>> +      Reg = MRI->getDwarfRegNum(MRI->getLLVMRegNum(Reg, true), false);
> >>>   Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa_register, 1);
> >>> -    Streamer.EmitULEB128IntValue(Instr.getRegister());
> >>> +    Streamer.EmitULEB128IntValue(Reg);
> >>>
> >>>   return;
> >>> }
> >>> @@ -1103,6 +1114,9 @@
> >>>     Instr.getOperation() == MCCFIInstruction::OpRelOffset;
> >>>
> >>>   unsigned Reg = Instr.getRegister();
> >>> +    if (!IsEH)
> >>> +      Reg = MRI->getDwarfRegNum(MRI->getLLVMRegNum(Reg, true), false);
> >>> +
> >>>   int Offset = Instr.getOffset();
> >>>   if (IsRelative)
> >>>     Offset -= CFAOffset;
> >>> @@ -1136,6 +1150,8 @@
> >>> }
> >>> case MCCFIInstruction::OpRestore: {
> >>>   unsigned Reg = Instr.getRegister();
> >>> +    if (!IsEH)
> >>> +      Reg = MRI->getDwarfRegNum(MRI->getLLVMRegNum(Reg, true), false);
> >>>   Streamer.EmitIntValue(dwarf::DW_CFA_restore | Reg, 1);
> >>>   return;
> >>> }
> >>> @@ -1290,10 +1306,10 @@
> >>> if (CIEVersion == 1) {
> >>>   assert(MRI->getRARegister() <= 255 &&
> >>>          "DWARF 2 encodes return_address_register in one byte");
> >>> -    streamer.EmitIntValue(MRI->getDwarfRegNum(MRI->getRARegister(),
> true), 1);
> >>> +    streamer.EmitIntValue(MRI->getDwarfRegNum(MRI->getRARegister(),
> IsEH), 1);
> >>> } else {
> >>>   streamer.EmitULEB128IntValue(
> >>> -        MRI->getDwarfRegNum(MRI->getRARegister(), true));
> >>> +        MRI->getDwarfRegNum(MRI->getRARegister(), IsEH));
> >>> }
> >>>
> >>> // Augmentation Data Length (optional)
> >>>
> >>> EMAIL PREFERENCES
> >>> http://reviews.llvm.org/settings/panel/emailpreferences/
> >>> <D7593.19836.patch>
> >>
> >
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150224/ca82b299/attachment.html>


More information about the llvm-commits mailing list