[PATCH 6/8] arc: libgloss: Accommodate MetaWare's standard symbol names

[email protected]
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
From: Alexey Brodkin <[email protected]>

It makes it usable with standard symbol names defined in default
linker scripts of the MetaWare toolchain.

Signed-off-by: Alexey Brodkin <[email protected]>
---
 libgloss/arc/arc-specific.h     | 32 ++++++++++++++++++++++++++
 libgloss/arc/arc-symbols.h      | 40 +++++++++++++++++++++++++++++++++
 libgloss/arc/arc-timer.c        | 18 ++++++++-------
 libgloss/arc/crt0.S             | 20 +++++++++--------
 libgloss/arc/emsk-uart-setup.c  |  3 ++-
 libgloss/arc/iotdk-uart-setup.c |  3 ++-
 libgloss/arc/sbrk.c             |  9 ++++----
 libgloss/arc/uart-8250.c        |  5 +++--
 8 files changed, 105 insertions(+), 25 deletions(-)
 create mode 100644 libgloss/arc/arc-specific.h
 create mode 100644 libgloss/arc/arc-symbols.h

diff --git a/libgloss/arc/arc-specific.h b/libgloss/arc/arc-specific.h
new file mode 100644
index 000000000..01f215a8e
--- /dev/null
+++ b/libgloss/arc/arc-specific.h
@@ -0,0 +1,32 @@
+/*
+ * arc-specific.h -- provide ARC-specific definitions
+ *
+ * Copyright (c) 2024 Synopsys Inc.
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ *
+ */
+
+#ifndef _ARC_SPECIFIC_H
+#define _ARC_SPECIFIC_H
+
+/* First check for MetaWare compiler as it also defines __GNUC__.  */
+#if defined (__CCAC__)
+	#define read_aux_reg(r)		_lr(r)
+	#define write_aux_reg(r, v)	_sr((unsigned int)(v), r)
+#elif defined (__GNUC__)
+	#define read_aux_reg(r)		__builtin_arc_lr(r)
+	#define write_aux_reg(v, r)	__builtin_arc_sr((unsigned int)(v), r)
+#else
+	#error "Unexpected compiler"
+#endif
+
+#endif /* _ARC_SPECIFIC_H */
diff --git a/libgloss/arc/arc-symbols.h b/libgloss/arc/arc-symbols.h
new file mode 100644
index 000000000..a41ee3953
--- /dev/null
+++ b/libgloss/arc/arc-symbols.h
@@ -0,0 +1,40 @@
+/*
+ * arc-symbols.h -- provide ARC-specific symbols
+ *
+ * Copyright (c) 2024 Synopsys Inc.
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ *
+ */
+
+#ifndef _ARC_SYMBOLS_H
+#define _ARC_SYMBOLS_H
+
+/* First check for MetaWare compiler as it also defines __GNUC__.  */
+#if defined (__CCAC__)
+	#define STACK_TOP		_estack
+	#define SMALL_DATA_BASE		_SDA_BASE_
+	#define SMALL_DATA_BSS_START	_fsbss
+	#define SMALL_DATA_BSS_END	_esbss
+	#define START_HEAP		_fheap
+	#define END_HEAP		_eheap
+#elif defined (__GNUC__)
+	#define STACK_TOP		__stack_top
+	#define SMALL_DATA_BASE		__SDATA_BEGIN__
+	#define SMALL_DATA_BSS_START	__sbss_start
+	#define SMALL_DATA_BSS_END	_end
+	#define START_HEAP		__start_heap
+	#define END_HEAP		__end_heap
+#else
+	#error "Unexpected compiler"
+#endif
+
+#endif /* _ARC_SYMBOLS_H */
\ No newline at end of file
diff --git a/libgloss/arc/arc-timer.c b/libgloss/arc/arc-timer.c
index 2437407e7..0d3074d5a 100644
--- a/libgloss/arc/arc-timer.c
+++ b/libgloss/arc/arc-timer.c
@@ -15,6 +15,8 @@
  *
  */
 
+#include "arc-specific.h"
+
 #define ARC_TIM_BUILD		0x75
 #define ARC_TIM_BUILD_VER_MASK	0x00FF
 #define ARC_TIM_BUILD_TIM0_FL	0x0100
@@ -37,7 +39,7 @@ const unsigned int arc_timer_default = 0;
 static int
 _arc_timer_present (unsigned int tim)
 {
-  unsigned int bcr = __builtin_arc_lr (ARC_TIM_BUILD);
+  unsigned int bcr = read_aux_reg (ARC_TIM_BUILD);
   unsigned int ver = bcr & ARC_TIM_BUILD_VER_MASK;
 
   if (ver == 0)
@@ -59,9 +61,9 @@ _arc_timer_read (unsigned int tim)
   if (_arc_timer_present (tim))
     {
       if (tim == 0)
-	return __builtin_arc_lr (ARC_TIM_COUNT0);
+	return read_aux_reg (ARC_TIM_COUNT0);
       else if (tim == 1)
-	return __builtin_arc_lr (ARC_TIM_COUNT1);
+	return read_aux_reg (ARC_TIM_COUNT1);
     }
 
   return 0;
@@ -95,14 +97,14 @@ _arc_timer_reset (unsigned int tim)
 	  return;
 	}
 
-      ctrl = __builtin_arc_lr (tim_control);
+      ctrl = read_aux_reg (tim_control);
       /* Disable timer interrupt when programming.  */
-      __builtin_arc_sr (0, tim_control);
+      write_aux_reg (0, tim_control);
       /* Default limit is 24-bit, increase it to 32-bit.  */
-      __builtin_arc_sr (0xFFFFFFFF, tim_limit);
+      write_aux_reg (0xFFFFFFFF, tim_limit);
       /* Set NH bit to count only when processor is running.  */
-      __builtin_arc_sr (ctrl | ARC_TIM_CONTROL_NH_FL, tim_control);
-      __builtin_arc_sr (0, tim_count);
+      write_aux_reg (ctrl | ARC_TIM_CONTROL_NH_FL, tim_control);
+      write_aux_reg (0, tim_count);
     }
 }
 
diff --git a/libgloss/arc/crt0.S b/libgloss/arc/crt0.S
index 04fe82d7e..a64599eaa 100644
--- a/libgloss/arc/crt0.S
+++ b/libgloss/arc/crt0.S
@@ -41,6 +41,8 @@
    the initialization code.
 */
 
+#include "arc-symbols.h"
+
 /* Compatibility with older ARC GCC, that doesn't provide some of the
    preprocessor defines used by newlib and libgloss for ARC.  */
 #if defined (__Xbarrel_shifter) && !defined (__ARC_BARREL_SHIFTER__)
@@ -106,11 +108,11 @@ IVT_ENTRY(IRQ_20)            ; 20                       0x50    80
 #ifdef __ARC601__
 ; Startup code for the ARC601 processor
 __start:
-	mov	gp, __SDATA_BEGIN__
-	mov	sp, __stack_top	; Point to top of stack
+	mov	gp, SMALL_DATA_BASE
+	mov	sp, STACK_TOP		; Point to top of stack
 	mov	r5, 0			; Zero value
-	mov_s	r2, __sbss_start	; r2 = start of the bss section
-	sub	r3, _end, r2		; r3 = size of the bss section in bytes
+	mov_s	r2, SMALL_DATA_BSS_START	; r2 = start of the bss section
+	sub	r3, SMALL_DATA_BSS_START, r2	; r3 = size of the bss section in bytes
 
 	asr_s	r3, r3
 	asr_s	r3, r3			; r3 = size of bss in words
@@ -146,9 +148,9 @@ __start:
 	;; Initialize jli_base
 	sr	__JLI_TABLE__,[jli_base]
 #endif
-	mov	gp, __SDATA_BEGIN__
-	mov_s	r2, __sbss_start	; r2 = start of the bss section
-	sub	r3, _end, r2		; r3 = size of the bss section in bytes
+	mov	gp, SMALL_DATA_BASE
+	mov_s	r2, SMALL_DATA_BSS_START	; r2 = start of the bss section
+	sub	r3, SMALL_DATA_BSS_END, r2	; r3 = size of the bss section in bytes
 	; set up the loop counter register to the size (in words) of the bss section
 #if defined (__ARC_BARREL_SHIFTER__)
 	asr.f        lp_count, r3, 2
@@ -162,12 +164,12 @@ __start:
 	add	r3, pcl, 20
 	sr	r3, [2]			; LP_END
 	; initialize stack pointer, and this instruction has 2 words
-	mov	sp, __stack_top
+	mov	sp, STACK_TOP
 	mov_s	r3, 0
 	st.ab	r3, [r2, 4]		; zero out the word
 .Lend_zbss:
 #else
-	mov	sp, __stack_top	; initialize stack pointer
+	mov	sp, STACK_TOP	; initialize stack pointer
 	mov_s	r3,0
 	; loop to zero out the bss.  Enter loop only if lp_count != 0
 	lpnz	.Lend_zbss
diff --git a/libgloss/arc/emsk-uart-setup.c b/libgloss/arc/emsk-uart-setup.c
index b8e1ea859..16b5f7b38 100644
--- a/libgloss/arc/emsk-uart-setup.c
+++ b/libgloss/arc/emsk-uart-setup.c
@@ -15,6 +15,7 @@
  *
  */
 
+#include "arc-specific.h"
 #include "uart-8250.h"
 
 /* Setup UART parameters.  */
@@ -22,7 +23,7 @@ int
 _setup_low_level (void)
 {
   const uint32_t aux_dmp_per = 0x20a;
-  void * const uart_base = (char *)__builtin_arc_lr(aux_dmp_per) + 0x00009000;
+  void * const uart_base = (char *)read_aux_reg(aux_dmp_per) + 0x00009000;
   const int uart_aux_mapped = 0;
   const uint32_t uart_clock = 50000000;
   const uint32_t uart_baud = 115200;
diff --git a/libgloss/arc/iotdk-uart-setup.c b/libgloss/arc/iotdk-uart-setup.c
index e6d2ac887..a7b1183b8 100644
--- a/libgloss/arc/iotdk-uart-setup.c
+++ b/libgloss/arc/iotdk-uart-setup.c
@@ -15,6 +15,7 @@
  *
  */
 
+#include "arc-specific.h"
 #include "uart-8250.h"
 
 /* Setup UART parameters.  */
@@ -28,7 +29,7 @@ _setup_low_level (void)
   const uint32_t uart_baud = 115200;
 
   /* For this platform we have to enable UART clock before configuring it.   */
-  __builtin_arc_sr (0x01, (uint32_t) uart_base + uart_clk_ena);
+  write_aux_reg (0x01, (uint32_t) uart_base + uart_clk_ena);
 
   _uart_8250_setup (uart_base, uart_aux_mapped, uart_clock, uart_baud);
 
diff --git a/libgloss/arc/sbrk.c b/libgloss/arc/sbrk.c
index 8cb8461dd..2a83a5ac9 100644
--- a/libgloss/arc/sbrk.c
+++ b/libgloss/arc/sbrk.c
@@ -30,9 +30,10 @@
 
 #include <sys/types.h>
 #include <sys/errno.h>
+#include "arc-symbols.h"
 
-extern char __start_heap;
-extern char __end_heap;
+extern char START_HEAP;
+extern char END_HEAP;
 
 caddr_t
 _sbrk (size_t nbytes)
@@ -42,7 +43,7 @@ _sbrk (size_t nbytes)
 
   if (heap_ptr == NULL)
     {
-      heap_ptr = &__start_heap;
+      heap_ptr = &START_HEAP;
     }
 
   /* Align the 'heap_ptr' so that memory will always be allocated at word
@@ -50,7 +51,7 @@ _sbrk (size_t nbytes)
   heap_ptr = (char *) ((((unsigned long) heap_ptr) + 7) & ~7);
   prev_heap_ptr = heap_ptr;
 
-  if ((heap_ptr + nbytes) < &__end_heap)
+  if ((heap_ptr + nbytes) < &END_HEAP)
     {
       heap_ptr += nbytes;
       return (caddr_t) prev_heap_ptr;
diff --git a/libgloss/arc/uart-8250.c b/libgloss/arc/uart-8250.c
index 6f4e9f3d6..fd9c55fc4 100644
--- a/libgloss/arc/uart-8250.c
+++ b/libgloss/arc/uart-8250.c
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <errno.h>
+#include "arc-specific.h"
 
 /*
  * List of UART 8250 registers with offsets:
@@ -144,7 +145,7 @@ _uart_8250_write_reg (const struct _uart_8250 *uart, uint32_t reg,
 		      uint32_t value)
 {
   if (uart->aux_mapped)
-    __builtin_arc_sr (value, (uint32_t) uart->base + reg);
+    write_aux_reg (value, (uint32_t) uart->base + reg);
   else
     *(volatile uint32_t *)(uart->base + reg) = value;
 }
@@ -154,7 +155,7 @@ static inline uint32_t
 _uart_8250_read_reg (const struct _uart_8250 *uart, uint32_t reg)
 {
   if (uart->aux_mapped)
-    return __builtin_arc_lr ((uint32_t) uart->base + reg);
+    return read_aux_reg ((uint32_t) uart->base + reg);
   else
     return *(volatile uint32_t *)(uart->base + reg);
 }
-- 
2.34.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.