On Sat, 2021-11-06 at 16:40 +0800, Chenghua Xu wrote:

/* snip */

> diff --git a/libgcc/config/loongarch/crti.S b/libgcc/config/loongarch/crti.S
> new file mode 100644
> index 00000000000..bac029874b5
> --- /dev/null
> +++ b/libgcc/config/loongarch/crti.S
> @@ -0,0 +1,43 @@
> +/* Copyright (C) 2021 Free Software Foundation, Inc.
> +
> +This file is part of GCC.
> +
> +GCC is free software; you can redistribute it and/or modify it under
> +the terms of the GNU General Public License as published by the Free
> +Software Foundation; either version 3, or (at your option) any later
> +version.
> +
> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +for more details.
> +
> +Under Section 7 of GPL version 3, you are granted additional
> +permissions described in the GCC Runtime Library Exception, version
> +3.1, as published by the Free Software Foundation.
> +
> +You should have received a copy of the GNU General Public License and
> +a copy of the GCC Runtime Library Exception along with this program;
> +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +<http://www.gnu.org/licenses/>.  */
> +
> +/* 4 slots for argument spill area.  1 for cpreturn, 1 for stack.
> +   Return spill offset of 8.  Aligned to 16 bytes for lp64.  */
> +
> +       .section .init,"ax",@progbits
> +       .globl  _init
> +       .type   _init,@function
> +_init:
> +       addi.d   $r3,$r3,-16
> +       st.d      $r1,$r3,8
> +       addi.d   $r3,$r3,16
> +       jirl    $r0,$r1,0
> +
> +       .section .fini,"ax",@progbits
> +       .globl  _fini
> +       .type   _fini,@function
> +_fini:
> +       addi.d   $r3,$r3,-16
> +       st.d      $r1,$r3,8
> +       addi.d   $r3,$r3,16
> +       jirl    $r0,$r1,0

There is some inconsistency of "tabs" or "spaces" between the
instruction and the operands.  Likewisely, other *.S files.

/* snip */

> diff --git a/libgcc/config/loongarch/linux-unwind.h 
> b/libgcc/config/loongarch/linux-unwind.h
> new file mode 100644
> index 00000000000..8c9dfa56a6d
> --- /dev/null
> +++ b/libgcc/config/loongarch/linux-unwind.h
> @@ -0,0 +1,80 @@
> +/* DWARF2 EH unwinding support for LoongArch Linux.
> +   Copyright (C) 2021 Free Software Foundation, Inc.
> +
> +This file is part of GCC.
> +
> +GCC is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 3, or (at your option)
> +any later version.
> +
> +GCC is distributed in the hope that it will be useful,
> +but WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +GNU General Public License for more details.
> +
> +Under Section 7 of GPL version 3, you are granted additional
> +permissions described in the GCC Runtime Library Exception, version
> +3.1, as published by the Free Software Foundation.
> +
> +You should have received a copy of the GNU General Public License and
> +a copy of the GCC Runtime Library Exception along with this program;
> +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +<http://www.gnu.org/licenses/>.  */
> +
> +#ifndef inhibit_libc
> +/* Do code reading to identify a signal frame, and set the frame
> +   state data appropriately.  See unwind-dw2.c for the structs.  */
> +
> +#include <signal.h>
> +#include <sys/syscall.h>
> +#include <sys/ucontext.h>
> +
> +#define MD_FALLBACK_FRAME_STATE_FOR loongarch_fallback_frame_state
> +
> +static _Unwind_Reason_Code
> +loongarch_fallback_frame_state (struct _Unwind_Context *context,
> +                               _Unwind_FrameState *fs)
> +{
> +  u_int32_t *pc = (u_int32_t *) context->ra;
> +  struct sigcontext *sc;
> +  _Unwind_Ptr new_cfa;
> +  int i;
> +
> +  /* 03822c0b dli a7, 0x8b (sigreturn)  */
> +  /* 002b0000 syscall 0  */
> +  if (pc[1] != 0x002b0000)
> +    return _URC_END_OF_STACK;
> +  if (pc[0] == 0x03822c0b)
> +    {
> +      struct rt_sigframe
> +      {
> +       siginfo_t info;
> +       ucontext_t uc;
> +      } *rt_ = context->cfa;
> +      sc = &rt_->uc.uc_mcontext;
> +    }
> +  else
> +    return _URC_END_OF_STACK;
> +
> +  new_cfa = (_Unwind_Ptr) sc;
> +  fs->regs.cfa_how = CFA_REG_OFFSET;
> +  fs->regs.cfa_reg = __LIBGCC_STACK_POINTER_REGNUM__;
> +  fs->regs.cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa;
> +
> +  for (i = 0; i < 32; i++)
> +    {
> +      fs->regs.reg[i].how = REG_SAVED_OFFSET;
> +      fs->regs.reg[i].loc.offset = (_Unwind_Ptr) & (sc->sc_regs[i]) - 
> new_cfa;

There shouldn't be a space between the unary & and its operand.  And the
braces around sc->sc_regs[i] seems unnecessary.

In this particular case, the space makes it really looking similar to a
bitwise and expression...

Reply via email to