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...