[v7.1,01/13] ARC: ABI Implementation

Message ID 20200701000643.14065-1-vgupta@synopsys.com
State Superseded
Headers show
Series
  • [v7.1,01/13] ARC: ABI Implementation
Related show

Commit Message

H.J. Lu via Libc-alpha July 1, 2020, 12:06 a.m.
This code deals with the ARC ABI.
---
   Changes since v7:
     - Used void * (iso int *) in tls-macros.h
---
 sysdeps/arc/__longjmp.S       | 49 ++++++++++++++++++++++++
 sysdeps/arc/abort-instr.h     |  2 +
 sysdeps/arc/bits/endianness.h | 15 ++++++++
 sysdeps/arc/bits/setjmp.h     | 26 +++++++++++++
 sysdeps/arc/bsd-_setjmp.S     |  1 +
 sysdeps/arc/bsd-setjmp.S      |  1 +
 sysdeps/arc/dl-runtime.h      | 42 ++++++++++++++++++++
 sysdeps/arc/dl-sysdep.h       | 25 ++++++++++++
 sysdeps/arc/dl-trampoline.S   | 72 +++++++++++++++++++++++++++++++++++
 sysdeps/arc/gccframe.h        | 21 ++++++++++
 sysdeps/arc/jmpbuf-offsets.h  | 22 +++++++++++
 sysdeps/arc/jmpbuf-unwind.h   | 47 +++++++++++++++++++++++
 sysdeps/arc/machine-gmon.h    | 35 +++++++++++++++++
 sysdeps/arc/memusage.h        | 23 +++++++++++
 sysdeps/arc/setjmp.S          | 66 ++++++++++++++++++++++++++++++++
 sysdeps/arc/sysdep.h          | 53 ++++++++++++++++++++++++++
 sysdeps/arc/tls-macros.h      | 47 +++++++++++++++++++++++
 17 files changed, 547 insertions(+)
 create mode 100644 sysdeps/arc/__longjmp.S
 create mode 100644 sysdeps/arc/abort-instr.h
 create mode 100644 sysdeps/arc/bits/endianness.h
 create mode 100644 sysdeps/arc/bits/setjmp.h
 create mode 100644 sysdeps/arc/bsd-_setjmp.S
 create mode 100644 sysdeps/arc/bsd-setjmp.S
 create mode 100644 sysdeps/arc/dl-runtime.h
 create mode 100644 sysdeps/arc/dl-sysdep.h
 create mode 100644 sysdeps/arc/dl-trampoline.S
 create mode 100644 sysdeps/arc/gccframe.h
 create mode 100644 sysdeps/arc/jmpbuf-offsets.h
 create mode 100644 sysdeps/arc/jmpbuf-unwind.h
 create mode 100644 sysdeps/arc/machine-gmon.h
 create mode 100644 sysdeps/arc/memusage.h
 create mode 100644 sysdeps/arc/setjmp.S
 create mode 100644 sysdeps/arc/sysdep.h
 create mode 100644 sysdeps/arc/tls-macros.h

-- 
2.20.1

Comments

H.J. Lu via Libc-alpha July 1, 2020, 4:50 p.m. | #1
On 30/06/2020 21:06, Vineet Gupta via Libc-alpha wrote:
> This code deals with the ARC ABI.

> ---

>    Changes since v7:

>      - Used void * (iso int *) in tls-macros.h


LGTM, with just a couple of syntax nits below.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>


> ---

>  sysdeps/arc/__longjmp.S       | 49 ++++++++++++++++++++++++

>  sysdeps/arc/abort-instr.h     |  2 +

>  sysdeps/arc/bits/endianness.h | 15 ++++++++

>  sysdeps/arc/bits/setjmp.h     | 26 +++++++++++++

>  sysdeps/arc/bsd-_setjmp.S     |  1 +

>  sysdeps/arc/bsd-setjmp.S      |  1 +

>  sysdeps/arc/dl-runtime.h      | 42 ++++++++++++++++++++

>  sysdeps/arc/dl-sysdep.h       | 25 ++++++++++++

>  sysdeps/arc/dl-trampoline.S   | 72 +++++++++++++++++++++++++++++++++++

>  sysdeps/arc/gccframe.h        | 21 ++++++++++

>  sysdeps/arc/jmpbuf-offsets.h  | 22 +++++++++++

>  sysdeps/arc/jmpbuf-unwind.h   | 47 +++++++++++++++++++++++

>  sysdeps/arc/machine-gmon.h    | 35 +++++++++++++++++

>  sysdeps/arc/memusage.h        | 23 +++++++++++

>  sysdeps/arc/setjmp.S          | 66 ++++++++++++++++++++++++++++++++

>  sysdeps/arc/sysdep.h          | 53 ++++++++++++++++++++++++++

>  sysdeps/arc/tls-macros.h      | 47 +++++++++++++++++++++++

>  17 files changed, 547 insertions(+)

>  create mode 100644 sysdeps/arc/__longjmp.S

>  create mode 100644 sysdeps/arc/abort-instr.h

>  create mode 100644 sysdeps/arc/bits/endianness.h

>  create mode 100644 sysdeps/arc/bits/setjmp.h

>  create mode 100644 sysdeps/arc/bsd-_setjmp.S

>  create mode 100644 sysdeps/arc/bsd-setjmp.S

>  create mode 100644 sysdeps/arc/dl-runtime.h

>  create mode 100644 sysdeps/arc/dl-sysdep.h

>  create mode 100644 sysdeps/arc/dl-trampoline.S

>  create mode 100644 sysdeps/arc/gccframe.h

>  create mode 100644 sysdeps/arc/jmpbuf-offsets.h

>  create mode 100644 sysdeps/arc/jmpbuf-unwind.h

>  create mode 100644 sysdeps/arc/machine-gmon.h

>  create mode 100644 sysdeps/arc/memusage.h

>  create mode 100644 sysdeps/arc/setjmp.S

>  create mode 100644 sysdeps/arc/sysdep.h

>  create mode 100644 sysdeps/arc/tls-macros.h

> 

> diff --git a/sysdeps/arc/__longjmp.S b/sysdeps/arc/__longjmp.S

> new file mode 100644

> index 000000000000..fcbf1bb6c0e2

> --- /dev/null

> +++ b/sysdeps/arc/__longjmp.S

> @@ -0,0 +1,49 @@

> +/* longjmp for ARC.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public License as

> +   published by the Free Software Foundation; either version 2.1 of the

> +   License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#include <sysdep.h>

> +#include <jmpbuf-offsets.h>

> +

> +/* @ r0 = jump buffer from which regs will be restored

> +   @ r1 = value that setjmp( ) will return due to this longjmp.  */

> +

> +ENTRY (__longjmp)

> +

> +	LDR (blink, r0,  0)

> +	LDR (sp,    r0,  1)

> +	LDR (fp,    r0,  2)

> +	LDR (gp,    r0,  3)

> +

> +	LDR (r13,   r0,  4)

> +	LDR (r14,   r0,  5)

> +	LDR (r15,   r0,  6)

> +	LDR (r16,   r0,  7)

> +	LDR (r17,   r0,  8)

> +	LDR (r18,   r0,  9)

> +	LDR (r19,   r0, 10)

> +	LDR (r20,   r0, 11)

> +	LDR (r21,   r0, 12)

> +	LDR (r22,   r0, 13)

> +	LDR (r23,   r0, 14)

> +	LDR (r24,   r0, 15)

> +

> +	mov.f  r0, r1

> +	j.d    [blink]

> +	mov.z  r0, 1	/* don't return 0 to setjmp callsite from longjmp.  */

> +

> +END (__longjmp)


Ok, you have removed r25 save as pre previous discussion.

> diff --git a/sysdeps/arc/abort-instr.h b/sysdeps/arc/abort-instr.h

> new file mode 100644

> index 000000000000..49f33613c404

> --- /dev/null

> +++ b/sysdeps/arc/abort-instr.h

> @@ -0,0 +1,2 @@

> +/* FLAG 1 is privilege mode only instruction, hence will crash any program.  */

> +#define ABORT_INSTRUCTION asm ("flag 1")


Ok.

> diff --git a/sysdeps/arc/bits/endianness.h b/sysdeps/arc/bits/endianness.h

> new file mode 100644

> index 000000000000..8f17ca84b485

> --- /dev/null

> +++ b/sysdeps/arc/bits/endianness.h

> @@ -0,0 +1,15 @@

> +#ifndef _BITS_ENDIANNESS_H

> +#define _BITS_ENDIANNESS_H 1

> +

> +#ifndef _BITS_ENDIAN_H

> +# error "Never use <bits/endian.h> directly; include <endian.h> instead."

> +#endif

> +

> +/* ARC has selectable endianness.  */

> +#ifdef __BIG_ENDIAN__

> +# define __BYTE_ORDER __BIG_ENDIAN

> +#else

> +# define __BYTE_ORDER __LITTLE_ENDIAN

> +#endif

> +

> +#endif /* bits/endianness.h */


Ok.

> diff --git a/sysdeps/arc/bits/setjmp.h b/sysdeps/arc/bits/setjmp.h

> new file mode 100644

> index 000000000000..6bba95fafe0f

> --- /dev/null

> +++ b/sysdeps/arc/bits/setjmp.h

> @@ -0,0 +1,26 @@

> +/* Define the machine-dependent type `jmp_buf'.  ARC version.


I think current trend is to just use apostrophe instead of the grave
accent in such cases.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#ifndef _ARC_BITS_SETJMP_H

> +#define _ARC_BITS_SETJMP_H 1

> +

> +/* Saves r13-r25 (callee-saved), fp (frame pointer), sp (stack pointer),

> +   blink (branch-n-link).  */

> +typedef long int __jmp_buf[32];

> +

> +#endif


Ok.

> diff --git a/sysdeps/arc/bsd-_setjmp.S b/sysdeps/arc/bsd-_setjmp.S

> new file mode 100644

> index 000000000000..90b99cd8c3e0

> --- /dev/null

> +++ b/sysdeps/arc/bsd-_setjmp.S

> @@ -0,0 +1 @@

> +/* _setjmp is in setjmp.S.  */


Ok.

> diff --git a/sysdeps/arc/bsd-setjmp.S b/sysdeps/arc/bsd-setjmp.S

> new file mode 100644

> index 000000000000..d3b823c118bc

> --- /dev/null

> +++ b/sysdeps/arc/bsd-setjmp.S

> @@ -0,0 +1 @@

> +/* setjmp is in setjmp.S.  */


Ok.

> diff --git a/sysdeps/arc/dl-runtime.h b/sysdeps/arc/dl-runtime.h

> new file mode 100644

> index 000000000000..833e72c7385b

> --- /dev/null

> +++ b/sysdeps/arc/dl-runtime.h

> @@ -0,0 +1,42 @@

> +/* Helpers for On-demand PLT fixup for shared objects.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public License as

> +   published by the Free Software Foundation; either version 2.1 of the

> +   License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +/* PLT jump into resolver passes PC of PLTn, while _dl_fixup expects the

> +   address of corresponding .rela.plt entry.

> +

> +    - @plt0: runtime pc of first plt entry (DT_PLTGOT)

> +    - @pltn: runtime pc of plt entry being resolved

> +    - @size: size of .plt.rela entry (unused).  */

> +static inline uintptr_t

> +reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)

> +{

> +  unsigned long int idx = pltn - plt0;

> +

> +  /* PLT trampoline is 16 bytes. */


Double space after period.

> +  idx /= 16;

> +

> +  /* Exclude PLT0 and PLT1.  */

> +  return idx - 2;

> +}

> +

> +static inline uintptr_t

> +reloc_offset (uintptr_t plt0, uintptr_t pltn)

> +{

> +  size_t sz = sizeof (ElfW(Rela));

> +  return reloc_index (plt0, pltn, sz) * sz;

> +}


Ok.

> diff --git a/sysdeps/arc/dl-sysdep.h b/sysdeps/arc/dl-sysdep.h

> new file mode 100644

> index 000000000000..aefec2ba056a

> --- /dev/null

> +++ b/sysdeps/arc/dl-sysdep.h

> @@ -0,0 +1,25 @@

> +/* System-specific settings for dynamic linker code.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#include_next <dl-sysdep.h>

> +

> +/* _dl_argv cannot be attribute_relro, because _dl_start_user

> +   might write into it after _dl_start returns.  */

> +#define DL_ARGV_NOT_RELRO 1

> +

> +#define DL_EXTERN_PROTECTED_DATA


Ok.

> diff --git a/sysdeps/arc/dl-trampoline.S b/sysdeps/arc/dl-trampoline.S

> new file mode 100644

> index 000000000000..eb2a030046d6

> --- /dev/null

> +++ b/sysdeps/arc/dl-trampoline.S

> @@ -0,0 +1,72 @@

> +/* PLT trampolines.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#include <sysdep.h>

> +#include <libc-symbols.h>

> +

> +#include <sysdep.h>

> +#include <sys/syscall.h>

> +

> +/* resolver has atypical calling ABI (r11 and r12)

> +        PLTn which lands us here, sets up

> +	r11 = Module info (tpnt pointer as expected by resolver)

> +	r12 = PC of the PLTn itself - needed by resolver to find

> +	      corresponding .rela.plt entry.  */

> +

> +ENTRY (_dl_runtime_resolve)

> +

> +	/* save args to func being resolved before entering resolver.  */

> +	push_s	r0

> +	push_s	r1

> +	push_s	r2

> +	push_s	r3

> +	st.a	r4, [sp, -4]

> +	st.a	r5, [sp, -4]

> +	st.a	r6, [sp, -4]

> +	st.a	r7, [sp, -4]

> +	st.a	r8, [sp, -4]

> +	st.a	r9, [sp, -4]

> +	cfi_adjust_cfa_offset (40)

> +	push_s	blink

> +	cfi_adjust_cfa_offset (4)

> +	cfi_rel_offset (blink, 0)

> +

> +	mov_s 	r1, r12

> +	bl.d  	_dl_fixup

> +	mov   	r0, r11

> +

> +	/* restore regs back.  */

> +	ld.ab	blink,[sp, 4]

> +	cfi_adjust_cfa_offset (-4)

> +	cfi_restore (blink)

> +	ld.ab	r9, [sp, 4]

> +	ld.ab	r8, [sp, 4]

> +	ld.ab	r7, [sp, 4]

> +	ld.ab	r6, [sp, 4]

> +	ld.ab	r5, [sp, 4]

> +	ld.ab	r4, [sp, 4]

> +	pop_s   r3

> +	pop_s   r2

> +	pop_s   r1

> +	cfi_adjust_cfa_offset (-36)

> +

> +	j_s.d   [r0]    /* r0 has resolved function addr.  */

> +	pop_s   r0      /* restore first arg to resolved call.  */

> +	cfi_adjust_cfa_offset (-4)

> +	cfi_restore (r0)

> +END (_dl_runtime_resolve)


Ok.

> diff --git a/sysdeps/arc/gccframe.h b/sysdeps/arc/gccframe.h

> new file mode 100644

> index 000000000000..296857ba9ccc

> --- /dev/null

> +++ b/sysdeps/arc/gccframe.h

> @@ -0,0 +1,21 @@

> +/* Definition of object in frame unwind info.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#define FIRST_PSEUDO_REGISTER 40

> +

> +#include <sysdeps/generic/gccframe.h>


Ok.

> diff --git a/sysdeps/arc/jmpbuf-offsets.h b/sysdeps/arc/jmpbuf-offsets.h

> new file mode 100644

> index 000000000000..e7551cad3b47

> --- /dev/null

> +++ b/sysdeps/arc/jmpbuf-offsets.h

> @@ -0,0 +1,22 @@

> +/* Private macros for accessing __jmp_buf contents.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#define JB_SP	1

> +

> +/* Helper for generic ____longjmp_chk.  */


Ok.

> +#define JB_FRAME_ADDRESS(buf) ((void *) (unsigned long int) (buf[JB_SP]))

> diff --git a/sysdeps/arc/jmpbuf-unwind.h b/sysdeps/arc/jmpbuf-unwind.h

> new file mode 100644

> index 000000000000..697d3e2ee5e5

> --- /dev/null

> +++ b/sysdeps/arc/jmpbuf-unwind.h

> @@ -0,0 +1,47 @@

> +/* Examine __jmp_buf for unwinding frames.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#include <setjmp.h>

> +#include <jmpbuf-offsets.h>

> +#include <stdint.h>

> +#include <unwind.h>

> +

> +/* Test if longjmp to JMPBUF would unwind the frame

> +   containing a local variable at ADDRESS.  */

> +

> +#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \

> +  ((void *) (address) < (void *) demangle (jmpbuf[JB_SP]))

> +

> +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \

> +  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)

> +

> +static inline uintptr_t __attribute__ ((unused))

> +_jmpbuf_sp (__jmp_buf jmpbuf)

> +{

> +  uintptr_t sp = jmpbuf[JB_SP];

> +#ifdef PTR_DEMANGLE

> +  PTR_DEMANGLE (sp);

> +#endif

> +  return sp;

> +}

> +

> +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \

> +  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf_sp (_jmpbuf) - (_adj)))

> +

> +/* We use the normal longjmp for unwinding.  */

> +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)


Ok. As a side note teh jmpbuf-unwind.h is candidate for some consolidation
(the same macros are replicated in each architecture).

> diff --git a/sysdeps/arc/machine-gmon.h b/sysdeps/arc/machine-gmon.h

> new file mode 100644

> index 000000000000..a0d4e95a945d

> --- /dev/null

> +++ b/sysdeps/arc/machine-gmon.h

> @@ -0,0 +1,35 @@

> +/* Machine-dependent definitions for profiling support.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#include <sysdep.h>

> +

> +#define _MCOUNT_DECL(frompc, selfpc)					\

> +static void								\

> +__mcount_internal (unsigned long int frompc, unsigned long int selfpc)

> +

> +/* This is very simple as gcc does all the heavy lifting at _mcount call site

> +    - sets up caller's blink in r0, so frompc is setup correctly

> +    - preserve argument registers for original call.  */

> +

> +#define MCOUNT								\

> +void									\

> +_mcount (void *frompc)							\

> +{									\

> +  __mcount_internal ((unsigned long int) frompc,			\

> +		     (unsigned long int) __builtin_return_address (0));	\

> +}


Ok.

> diff --git a/sysdeps/arc/memusage.h b/sysdeps/arc/memusage.h

> new file mode 100644

> index 000000000000..724bc4de1312

> --- /dev/null

> +++ b/sysdeps/arc/memusage.h

> @@ -0,0 +1,23 @@

> +/* Machine-specific definitions for memory usage profiling, ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; })

> +

> +#define uatomic32_t unsigned int

> +

> +#include <sysdeps/generic/memusage.h>


Ok.

> diff --git a/sysdeps/arc/setjmp.S b/sysdeps/arc/setjmp.S

> new file mode 100644

> index 000000000000..01cc3af98237

> --- /dev/null

> +++ b/sysdeps/arc/setjmp.S

> @@ -0,0 +1,66 @@

> +/* setjmp for ARC.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +

> +#include <sysdep.h>

> +

> +/* Upon entry r0 = jump buffer into which regs will be saved.  */

> +ENTRY (setjmp)

> +	b.d	__sigsetjmp

> +	mov	r1, 1		/* save signals.  */

> +END (setjmp)

> +

> +/* Upon entry r0 = jump buffer into which regs will be saved.  */

> +ENTRY (_setjmp)

> +	b.d	__sigsetjmp

> +	mov	r1, 0		/* don't save signals.  */

> +END (_setjmp)

> +libc_hidden_def (_setjmp)

> +

> +/* Upon entry

> +   r0 = jump buffer into which regs will be saved

> +   r1 = do we need to save signals.  */

> +ENTRY (__sigsetjmp)

> +

> +	/* Make a note of where longjmp will return to.

> +	   that will be right next to this setjmp call-site in BLINK

> +	   since "C" caller of this routine will do a branch-n-link.  */

> +

> +	STR (blink, r0,  0)

> +	STR (sp,    r0,  1)

> +	STR (fp,    r0,  2)

> +	STR (gp,    r0,  3)

> +

> +	STR (r13,   r0,  4)

> +	STR (r14,   r0,  5)

> +	STR (r15,   r0,  6)

> +	STR (r16,   r0,  7)

> +	STR (r17,   r0,  8)

> +	STR (r18,   r0,  9)

> +	STR (r19,   r0, 10)

> +	STR (r20,   r0, 11)

> +	STR (r21,   r0, 12)

> +	STR (r22,   r0, 13)

> +	STR (r23,   r0, 14)

> +	STR (r24,   r0, 15)

> +

> +	b    __sigjmp_save

> +

> +END (__sigsetjmp)

> +

> +libc_hidden_def (__sigsetjmp)


Ok.

> diff --git a/sysdeps/arc/sysdep.h b/sysdeps/arc/sysdep.h

> new file mode 100644

> index 000000000000..9ac295bdf35b

> --- /dev/null

> +++ b/sysdeps/arc/sysdep.h

> @@ -0,0 +1,53 @@

> +/* Assembler macros for ARC.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public License as

> +   published by the Free Software Foundation; either version 2.1 of the

> +   License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library; if not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +#include <sysdeps/generic/sysdep.h>

> +

> +#ifdef	__ASSEMBLER__

> +

> +/* Syntactic details of assembler.

> +   ; is not newline but comment, # is also for comment.  */

> +# define ASM_SIZE_DIRECTIVE(name) .size name,.-name

> +

> +# define ENTRY(name)						\

> +	.align 4				ASM_LINE_SEP	\

> +	.globl C_SYMBOL_NAME(name)		ASM_LINE_SEP	\

> +	.type C_SYMBOL_NAME(name),%function	ASM_LINE_SEP	\

> +	C_LABEL(name)				ASM_LINE_SEP	\

> +	cfi_startproc				ASM_LINE_SEP	\

> +	CALL_MCOUNT

> +

> +# undef  END

> +# define END(name)						\

> +	cfi_endproc				ASM_LINE_SEP	\

> +	ASM_SIZE_DIRECTIVE(name)

> +

> +# ifdef SHARED

> +#  define PLTJMP(_x)	_x##@plt

> +# else

> +#  define PLTJMP(_x)	_x

> +# endif

> +

> +# define L(label) .L##label

> +

> +# define CALL_MCOUNT		/* Do nothing for now.  */

> +

> +# define STR(reg, rbase, off)	st  reg, [rbase, off * 4]

> +# define LDR(reg, rbase, off)	ld  reg, [rbase, off * 4]

> +

> +#endif	/* __ASSEMBLER__ */


OK.

> diff --git a/sysdeps/arc/tls-macros.h b/sysdeps/arc/tls-macros.h

> new file mode 100644

> index 000000000000..7a076182b977

> --- /dev/null

> +++ b/sysdeps/arc/tls-macros.h

> @@ -0,0 +1,47 @@

> +/* Macros to support TLS testing in times of missing compiler support.  ARC version.

> +   Copyright (C) 2020 Free Software Foundation, Inc.

> +

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library 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

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <https://www.gnu.org/licenses/>.  */

> +

> +

> +/* For now.  */

> +#define TLS_LD(x)	TLS_IE(x)

> +

> +#define TLS_GD(x)					\

> +  ({ void *__result;					\

> +     __asm__ ("add r0, pcl, @" #x "@tlsgd      \n"     	\

> +	  ".tls_gd_ld " #x "`bl __tls_get_addr@plt \n"	\

> +	  "mov %0, r0                    \n"		\

> +	  : "=&r" (__result)				\

> +	  ::"r0","r1","r2","r3","r4","r5","r6","r7",	\

> +	    "r8","r9","r10","r11","r12");		\

> +     __result; })

> +

> +#define TLS_LE(x)					\

> +  ({ void *__result;					\

> +     void *tp = __builtin_thread_pointer ();		\

> +     __asm__ ("add %0, %1, @" #x "@tpoff   \n"		\

> +	  : "=r" (__result) : "r"(tp));	        	\

> +     __result; })

> +

> +#define TLS_IE(x)					\

> +  ({ void *__result;					\

> +     void *tp = __builtin_thread_pointer ();		\

> +     __asm__ ("ld %0, [pcl, @" #x "@tlsie]      \n"     \

> +	  "add %0, %1, %0                       \n"	\

> +	  : "=&r" (__result) : "r" (tp));		\

> +     __result; })

> 


Ok.
H.J. Lu via Libc-alpha July 1, 2020, 7:36 p.m. | #2
On 7/1/20 9:50 AM, Adhemerval Zanella via Libc-alpha wrote:
> 

> 

> On 30/06/2020 21:06, Vineet Gupta via Libc-alpha wrote:

>> This code deals with the ARC ABI.

>> ---

>>    Changes since v7:

>>      - Used void * (iso int *) in tls-macros.h

> 

> LGTM, with just a couple of syntax nits below.

> 

> Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>


Thx. I suppose the process for new ports is to have a Reviewed-by on all patches,
squash them and push in 1 go (although in past I was asked to push the ARC elf
header patch).
Also do we need more than 1 Reviewed-by for this to be "push worthy" ?

>> +ENTRY (__longjmp)

>> +

>> +	LDR (blink, r0,  0)

>> +	LDR (sp,    r0,  1)

>> +	LDR (fp,    r0,  2)

>> +	LDR (gp,    r0,  3)

>> +

>> +	LDR (r13,   r0,  4)

>> +	LDR (r14,   r0,  5)

>> +	LDR (r15,   r0,  6)

>> +	LDR (r16,   r0,  7)

>> +	LDR (r17,   r0,  8)

>> +	LDR (r18,   r0,  9)

>> +	LDR (r19,   r0, 10)

>> +	LDR (r20,   r0, 11)

>> +	LDR (r21,   r0, 12)

>> +	LDR (r22,   r0, 13)

>> +	LDR (r23,   r0, 14)

>> +	LDR (r24,   r0, 15)

>> +

>> +	mov.f  r0, r1

>> +	j.d    [blink]

>> +	mov.z  r0, 1	/* don't return 0 to setjmp callsite from longjmp.  */

>> +

>> +END (__longjmp)

> 

> Ok, you have removed r25 save as pre previous discussion.


Right, and GP is being saved now.

>> diff --git a/sysdeps/arc/bits/setjmp.h b/sysdeps/arc/bits/setjmp.h

>> new file mode 100644

>> index 000000000000..6bba95fafe0f

>> --- /dev/null

>> +++ b/sysdeps/arc/bits/setjmp.h

>> @@ -0,0 +1,26 @@

>> +/* Define the machine-dependent type `jmp_buf'.  ARC version.

> 

> I think current trend is to just use apostrophe instead of the grave

> accent in such cases.


Ok changed.

>> +reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)

>> +{

>> +  unsigned long int idx = pltn - plt0;

>> +

>> +  /* PLT trampoline is 16 bytes. */

> 

> Double space after period.


Fixed.

>> +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \

>> +  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf_sp (_jmpbuf) - (_adj)))

>> +

>> +/* We use the normal longjmp for unwinding.  */

>> +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)

> 

> Ok. As a side note teh jmpbuf-unwind.h is candidate for some consolidation

> (the same macros are replicated in each architecture).


OK.
H.J. Lu via Libc-alpha July 1, 2020, 7:45 p.m. | #3
On 01/07/2020 16:36, Vineet Gupta wrote:
> On 7/1/20 9:50 AM, Adhemerval Zanella via Libc-alpha wrote:

>>

>>

>> On 30/06/2020 21:06, Vineet Gupta via Libc-alpha wrote:

>>> This code deals with the ARC ABI.

>>> ---

>>>    Changes since v7:

>>>      - Used void * (iso int *) in tls-macros.h

>>

>> LGTM, with just a couple of syntax nits below.

>>

>> Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> 

> Thx. I suppose the process for new ports is to have a Reviewed-by on all patches,

> squash them and push in 1 go (although in past I was asked to push the ARC elf

> header patch).


I think there is no need to squash them up in one commit, but I think
it would be better to commit them at the same time.

> Also do we need more than 1 Reviewed-by for this to be "push worthy" ?


I don't think so, unless someone raise some questioning on the review
itself.

I plan to finish them up by the end of the week.

> 

>>> +ENTRY (__longjmp)

>>> +

>>> +	LDR (blink, r0,  0)

>>> +	LDR (sp,    r0,  1)

>>> +	LDR (fp,    r0,  2)

>>> +	LDR (gp,    r0,  3)

>>> +

>>> +	LDR (r13,   r0,  4)

>>> +	LDR (r14,   r0,  5)

>>> +	LDR (r15,   r0,  6)

>>> +	LDR (r16,   r0,  7)

>>> +	LDR (r17,   r0,  8)

>>> +	LDR (r18,   r0,  9)

>>> +	LDR (r19,   r0, 10)

>>> +	LDR (r20,   r0, 11)

>>> +	LDR (r21,   r0, 12)

>>> +	LDR (r22,   r0, 13)

>>> +	LDR (r23,   r0, 14)

>>> +	LDR (r24,   r0, 15)

>>> +

>>> +	mov.f  r0, r1

>>> +	j.d    [blink]

>>> +	mov.z  r0, 1	/* don't return 0 to setjmp callsite from longjmp.  */

>>> +

>>> +END (__longjmp)

>>

>> Ok, you have removed r25 save as pre previous discussion.

> 

> Right, and GP is being saved now.

> 

>>> diff --git a/sysdeps/arc/bits/setjmp.h b/sysdeps/arc/bits/setjmp.h

>>> new file mode 100644

>>> index 000000000000..6bba95fafe0f

>>> --- /dev/null

>>> +++ b/sysdeps/arc/bits/setjmp.h

>>> @@ -0,0 +1,26 @@

>>> +/* Define the machine-dependent type `jmp_buf'.  ARC version.

>>

>> I think current trend is to just use apostrophe instead of the grave

>> accent in such cases.

> 

> Ok changed.

> 

>>> +reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)

>>> +{

>>> +  unsigned long int idx = pltn - plt0;

>>> +

>>> +  /* PLT trampoline is 16 bytes. */

>>

>> Double space after period.

> 

> Fixed.

> 

>>> +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \

>>> +  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf_sp (_jmpbuf) - (_adj)))

>>> +

>>> +/* We use the normal longjmp for unwinding.  */

>>> +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)

>>

>> Ok. As a side note teh jmpbuf-unwind.h is candidate for some consolidation

>> (the same macros are replicated in each architecture).

> 

> OK.

>

Patch

diff --git a/sysdeps/arc/__longjmp.S b/sysdeps/arc/__longjmp.S
new file mode 100644
index 000000000000..fcbf1bb6c0e2
--- /dev/null
+++ b/sysdeps/arc/__longjmp.S
@@ -0,0 +1,49 @@ 
+/* longjmp for ARC.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <jmpbuf-offsets.h>
+
+/* @ r0 = jump buffer from which regs will be restored
+   @ r1 = value that setjmp( ) will return due to this longjmp.  */
+
+ENTRY (__longjmp)
+
+	LDR (blink, r0,  0)
+	LDR (sp,    r0,  1)
+	LDR (fp,    r0,  2)
+	LDR (gp,    r0,  3)
+
+	LDR (r13,   r0,  4)
+	LDR (r14,   r0,  5)
+	LDR (r15,   r0,  6)
+	LDR (r16,   r0,  7)
+	LDR (r17,   r0,  8)
+	LDR (r18,   r0,  9)
+	LDR (r19,   r0, 10)
+	LDR (r20,   r0, 11)
+	LDR (r21,   r0, 12)
+	LDR (r22,   r0, 13)
+	LDR (r23,   r0, 14)
+	LDR (r24,   r0, 15)
+
+	mov.f  r0, r1
+	j.d    [blink]
+	mov.z  r0, 1	/* don't return 0 to setjmp callsite from longjmp.  */
+
+END (__longjmp)
diff --git a/sysdeps/arc/abort-instr.h b/sysdeps/arc/abort-instr.h
new file mode 100644
index 000000000000..49f33613c404
--- /dev/null
+++ b/sysdeps/arc/abort-instr.h
@@ -0,0 +1,2 @@ 
+/* FLAG 1 is privilege mode only instruction, hence will crash any program.  */
+#define ABORT_INSTRUCTION asm ("flag 1")
diff --git a/sysdeps/arc/bits/endianness.h b/sysdeps/arc/bits/endianness.h
new file mode 100644
index 000000000000..8f17ca84b485
--- /dev/null
+++ b/sysdeps/arc/bits/endianness.h
@@ -0,0 +1,15 @@ 
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+/* ARC has selectable endianness.  */
+#ifdef __BIG_ENDIAN__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/arc/bits/setjmp.h b/sysdeps/arc/bits/setjmp.h
new file mode 100644
index 000000000000..6bba95fafe0f
--- /dev/null
+++ b/sysdeps/arc/bits/setjmp.h
@@ -0,0 +1,26 @@ 
+/* Define the machine-dependent type `jmp_buf'.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _ARC_BITS_SETJMP_H
+#define _ARC_BITS_SETJMP_H 1
+
+/* Saves r13-r25 (callee-saved), fp (frame pointer), sp (stack pointer),
+   blink (branch-n-link).  */
+typedef long int __jmp_buf[32];
+
+#endif
diff --git a/sysdeps/arc/bsd-_setjmp.S b/sysdeps/arc/bsd-_setjmp.S
new file mode 100644
index 000000000000..90b99cd8c3e0
--- /dev/null
+++ b/sysdeps/arc/bsd-_setjmp.S
@@ -0,0 +1 @@ 
+/* _setjmp is in setjmp.S.  */
diff --git a/sysdeps/arc/bsd-setjmp.S b/sysdeps/arc/bsd-setjmp.S
new file mode 100644
index 000000000000..d3b823c118bc
--- /dev/null
+++ b/sysdeps/arc/bsd-setjmp.S
@@ -0,0 +1 @@ 
+/* setjmp is in setjmp.S.  */
diff --git a/sysdeps/arc/dl-runtime.h b/sysdeps/arc/dl-runtime.h
new file mode 100644
index 000000000000..833e72c7385b
--- /dev/null
+++ b/sysdeps/arc/dl-runtime.h
@@ -0,0 +1,42 @@ 
+/* Helpers for On-demand PLT fixup for shared objects.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* PLT jump into resolver passes PC of PLTn, while _dl_fixup expects the
+   address of corresponding .rela.plt entry.
+
+    - @plt0: runtime pc of first plt entry (DT_PLTGOT)
+    - @pltn: runtime pc of plt entry being resolved
+    - @size: size of .plt.rela entry (unused).  */
+static inline uintptr_t
+reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)
+{
+  unsigned long int idx = pltn - plt0;
+
+  /* PLT trampoline is 16 bytes. */
+  idx /= 16;
+
+  /* Exclude PLT0 and PLT1.  */
+  return idx - 2;
+}
+
+static inline uintptr_t
+reloc_offset (uintptr_t plt0, uintptr_t pltn)
+{
+  size_t sz = sizeof (ElfW(Rela));
+  return reloc_index (plt0, pltn, sz) * sz;
+}
diff --git a/sysdeps/arc/dl-sysdep.h b/sysdeps/arc/dl-sysdep.h
new file mode 100644
index 000000000000..aefec2ba056a
--- /dev/null
+++ b/sysdeps/arc/dl-sysdep.h
@@ -0,0 +1,25 @@ 
+/* System-specific settings for dynamic linker code.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include_next <dl-sysdep.h>
+
+/* _dl_argv cannot be attribute_relro, because _dl_start_user
+   might write into it after _dl_start returns.  */
+#define DL_ARGV_NOT_RELRO 1
+
+#define DL_EXTERN_PROTECTED_DATA
diff --git a/sysdeps/arc/dl-trampoline.S b/sysdeps/arc/dl-trampoline.S
new file mode 100644
index 000000000000..eb2a030046d6
--- /dev/null
+++ b/sysdeps/arc/dl-trampoline.S
@@ -0,0 +1,72 @@ 
+/* PLT trampolines.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libc-symbols.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+/* resolver has atypical calling ABI (r11 and r12)
+        PLTn which lands us here, sets up
+	r11 = Module info (tpnt pointer as expected by resolver)
+	r12 = PC of the PLTn itself - needed by resolver to find
+	      corresponding .rela.plt entry.  */
+
+ENTRY (_dl_runtime_resolve)
+
+	/* save args to func being resolved before entering resolver.  */
+	push_s	r0
+	push_s	r1
+	push_s	r2
+	push_s	r3
+	st.a	r4, [sp, -4]
+	st.a	r5, [sp, -4]
+	st.a	r6, [sp, -4]
+	st.a	r7, [sp, -4]
+	st.a	r8, [sp, -4]
+	st.a	r9, [sp, -4]
+	cfi_adjust_cfa_offset (40)
+	push_s	blink
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (blink, 0)
+
+	mov_s 	r1, r12
+	bl.d  	_dl_fixup
+	mov   	r0, r11
+
+	/* restore regs back.  */
+	ld.ab	blink,[sp, 4]
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (blink)
+	ld.ab	r9, [sp, 4]
+	ld.ab	r8, [sp, 4]
+	ld.ab	r7, [sp, 4]
+	ld.ab	r6, [sp, 4]
+	ld.ab	r5, [sp, 4]
+	ld.ab	r4, [sp, 4]
+	pop_s   r3
+	pop_s   r2
+	pop_s   r1
+	cfi_adjust_cfa_offset (-36)
+
+	j_s.d   [r0]    /* r0 has resolved function addr.  */
+	pop_s   r0      /* restore first arg to resolved call.  */
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r0)
+END (_dl_runtime_resolve)
diff --git a/sysdeps/arc/gccframe.h b/sysdeps/arc/gccframe.h
new file mode 100644
index 000000000000..296857ba9ccc
--- /dev/null
+++ b/sysdeps/arc/gccframe.h
@@ -0,0 +1,21 @@ 
+/* Definition of object in frame unwind info.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define FIRST_PSEUDO_REGISTER 40
+
+#include <sysdeps/generic/gccframe.h>
diff --git a/sysdeps/arc/jmpbuf-offsets.h b/sysdeps/arc/jmpbuf-offsets.h
new file mode 100644
index 000000000000..e7551cad3b47
--- /dev/null
+++ b/sysdeps/arc/jmpbuf-offsets.h
@@ -0,0 +1,22 @@ 
+/* Private macros for accessing __jmp_buf contents.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define JB_SP	1
+
+/* Helper for generic ____longjmp_chk.  */
+#define JB_FRAME_ADDRESS(buf) ((void *) (unsigned long int) (buf[JB_SP]))
diff --git a/sysdeps/arc/jmpbuf-unwind.h b/sysdeps/arc/jmpbuf-unwind.h
new file mode 100644
index 000000000000..697d3e2ee5e5
--- /dev/null
+++ b/sysdeps/arc/jmpbuf-unwind.h
@@ -0,0 +1,47 @@ 
+/* Examine __jmp_buf for unwinding frames.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <setjmp.h>
+#include <jmpbuf-offsets.h>
+#include <stdint.h>
+#include <unwind.h>
+
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+
+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
+  ((void *) (address) < (void *) demangle (jmpbuf[JB_SP]))
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+static inline uintptr_t __attribute__ ((unused))
+_jmpbuf_sp (__jmp_buf jmpbuf)
+{
+  uintptr_t sp = jmpbuf[JB_SP];
+#ifdef PTR_DEMANGLE
+  PTR_DEMANGLE (sp);
+#endif
+  return sp;
+}
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf_sp (_jmpbuf) - (_adj)))
+
+/* We use the normal longjmp for unwinding.  */
+#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
diff --git a/sysdeps/arc/machine-gmon.h b/sysdeps/arc/machine-gmon.h
new file mode 100644
index 000000000000..a0d4e95a945d
--- /dev/null
+++ b/sysdeps/arc/machine-gmon.h
@@ -0,0 +1,35 @@ 
+/* Machine-dependent definitions for profiling support.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+#define _MCOUNT_DECL(frompc, selfpc)					\
+static void								\
+__mcount_internal (unsigned long int frompc, unsigned long int selfpc)
+
+/* This is very simple as gcc does all the heavy lifting at _mcount call site
+    - sets up caller's blink in r0, so frompc is setup correctly
+    - preserve argument registers for original call.  */
+
+#define MCOUNT								\
+void									\
+_mcount (void *frompc)							\
+{									\
+  __mcount_internal ((unsigned long int) frompc,			\
+		     (unsigned long int) __builtin_return_address (0));	\
+}
diff --git a/sysdeps/arc/memusage.h b/sysdeps/arc/memusage.h
new file mode 100644
index 000000000000..724bc4de1312
--- /dev/null
+++ b/sysdeps/arc/memusage.h
@@ -0,0 +1,23 @@ 
+/* Machine-specific definitions for memory usage profiling, ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; })
+
+#define uatomic32_t unsigned int
+
+#include <sysdeps/generic/memusage.h>
diff --git a/sysdeps/arc/setjmp.S b/sysdeps/arc/setjmp.S
new file mode 100644
index 000000000000..01cc3af98237
--- /dev/null
+++ b/sysdeps/arc/setjmp.S
@@ -0,0 +1,66 @@ 
+/* setjmp for ARC.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+
+#include <sysdep.h>
+
+/* Upon entry r0 = jump buffer into which regs will be saved.  */
+ENTRY (setjmp)
+	b.d	__sigsetjmp
+	mov	r1, 1		/* save signals.  */
+END (setjmp)
+
+/* Upon entry r0 = jump buffer into which regs will be saved.  */
+ENTRY (_setjmp)
+	b.d	__sigsetjmp
+	mov	r1, 0		/* don't save signals.  */
+END (_setjmp)
+libc_hidden_def (_setjmp)
+
+/* Upon entry
+   r0 = jump buffer into which regs will be saved
+   r1 = do we need to save signals.  */
+ENTRY (__sigsetjmp)
+
+	/* Make a note of where longjmp will return to.
+	   that will be right next to this setjmp call-site in BLINK
+	   since "C" caller of this routine will do a branch-n-link.  */
+
+	STR (blink, r0,  0)
+	STR (sp,    r0,  1)
+	STR (fp,    r0,  2)
+	STR (gp,    r0,  3)
+
+	STR (r13,   r0,  4)
+	STR (r14,   r0,  5)
+	STR (r15,   r0,  6)
+	STR (r16,   r0,  7)
+	STR (r17,   r0,  8)
+	STR (r18,   r0,  9)
+	STR (r19,   r0, 10)
+	STR (r20,   r0, 11)
+	STR (r21,   r0, 12)
+	STR (r22,   r0, 13)
+	STR (r23,   r0, 14)
+	STR (r24,   r0, 15)
+
+	b    __sigjmp_save
+
+END (__sigsetjmp)
+
+libc_hidden_def (__sigsetjmp)
diff --git a/sysdeps/arc/sysdep.h b/sysdeps/arc/sysdep.h
new file mode 100644
index 000000000000..9ac295bdf35b
--- /dev/null
+++ b/sysdeps/arc/sysdep.h
@@ -0,0 +1,53 @@ 
+/* Assembler macros for ARC.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/generic/sysdep.h>
+
+#ifdef	__ASSEMBLER__
+
+/* Syntactic details of assembler.
+   ; is not newline but comment, # is also for comment.  */
+# define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+# define ENTRY(name)						\
+	.align 4				ASM_LINE_SEP	\
+	.globl C_SYMBOL_NAME(name)		ASM_LINE_SEP	\
+	.type C_SYMBOL_NAME(name),%function	ASM_LINE_SEP	\
+	C_LABEL(name)				ASM_LINE_SEP	\
+	cfi_startproc				ASM_LINE_SEP	\
+	CALL_MCOUNT
+
+# undef  END
+# define END(name)						\
+	cfi_endproc				ASM_LINE_SEP	\
+	ASM_SIZE_DIRECTIVE(name)
+
+# ifdef SHARED
+#  define PLTJMP(_x)	_x##@plt
+# else
+#  define PLTJMP(_x)	_x
+# endif
+
+# define L(label) .L##label
+
+# define CALL_MCOUNT		/* Do nothing for now.  */
+
+# define STR(reg, rbase, off)	st  reg, [rbase, off * 4]
+# define LDR(reg, rbase, off)	ld  reg, [rbase, off * 4]
+
+#endif	/* __ASSEMBLER__ */
diff --git a/sysdeps/arc/tls-macros.h b/sysdeps/arc/tls-macros.h
new file mode 100644
index 000000000000..7a076182b977
--- /dev/null
+++ b/sysdeps/arc/tls-macros.h
@@ -0,0 +1,47 @@ 
+/* Macros to support TLS testing in times of missing compiler support.  ARC version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+
+/* For now.  */
+#define TLS_LD(x)	TLS_IE(x)
+
+#define TLS_GD(x)					\
+  ({ void *__result;					\
+     __asm__ ("add r0, pcl, @" #x "@tlsgd      \n"     	\
+	  ".tls_gd_ld " #x "`bl __tls_get_addr@plt \n"	\
+	  "mov %0, r0                    \n"		\
+	  : "=&r" (__result)				\
+	  ::"r0","r1","r2","r3","r4","r5","r6","r7",	\
+	    "r8","r9","r10","r11","r12");		\
+     __result; })
+
+#define TLS_LE(x)					\
+  ({ void *__result;					\
+     void *tp = __builtin_thread_pointer ();		\
+     __asm__ ("add %0, %1, @" #x "@tpoff   \n"		\
+	  : "=r" (__result) : "r"(tp));	        	\
+     __result; })
+
+#define TLS_IE(x)					\
+  ({ void *__result;					\
+     void *tp = __builtin_thread_pointer ();		\
+     __asm__ ("ld %0, [pcl, @" #x "@tlsie]      \n"     \
+	  "add %0, %1, %0                       \n"	\
+	  : "=&r" (__result) : "r" (tp));		\
+     __result; })