Add arc compiler-rt functions and reloc type for mwdt (#1238)

Add arc compiler-rt functions and reloc type for arc MetaWare
Development Toolkit (mwdt), controlled by macro __CCAC__.
This commit is contained in:
Xu Jun 2022-06-20 09:03:31 +08:00 committed by GitHub
parent f975a987bf
commit d0676930dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -13,6 +13,7 @@
#define R_ARC_32_ME 27
/* clang-format off */
#ifndef __CCAC__
void __st_r13_to_r15();
void __st_r13_to_r16();
void __st_r13_to_r17();
@ -41,29 +42,86 @@ void __divdf3();
void __divdi3();
void __divsf3();
void __divsi3();
void __eqsf2();
void __extendsfdf2();
void __fixdfsi();
void __floatsidf();
void __floatsisf();
void __gedf2();
void __gtdf2();
void __ledf2();
void __lesf2();
void __ltdf2();
void __muldf3();
void __mulsf3();
void __subdf3();
void __subsf3();
void __truncdfsf2();
#else
void __ac_push_13_to_13();
void __ac_push_13_to_14();
void __ac_push_13_to_15();
void __ac_push_13_to_16();
void __ac_push_13_to_17();
void __ac_push_13_to_18();
void __ac_push_13_to_19();
void __ac_push_13_to_20();
void __ac_push_13_to_21();
void __ac_push_13_to_22();
void __ac_push_13_to_23();
void __ac_push_13_to_24();
void __ac_push_13_to_25();
void __ac_push_13_to_26();
void __ac_push_none();
void __ac_pop_13_to_26();
void __ac_pop_13_to_26v();
void __ac_pop_13_to_25();
void __ac_pop_13_to_25v();
void __ac_pop_13_to_24();
void __ac_pop_13_to_24v();
void __ac_pop_13_to_23();
void __ac_pop_13_to_23v();
void __ac_pop_13_to_22();
void __ac_pop_13_to_22v();
void __ac_pop_13_to_21();
void __ac_pop_13_to_21v();
void __ac_pop_13_to_20();
void __ac_pop_13_to_20v();
void __ac_pop_13_to_19();
void __ac_pop_13_to_19v();
void __ac_pop_13_to_18();
void __ac_pop_13_to_18v();
void __ac_pop_13_to_17();
void __ac_pop_13_to_17v();
void __ac_pop_13_to_16();
void __ac_pop_13_to_16v();
void __ac_pop_13_to_15();
void __ac_pop_13_to_15v();
void __ac_pop_13_to_14();
void __ac_pop_13_to_14v();
void __ac_pop_13_to_13();
void __ac_pop_13_to_13v();
void __ac_pop_none();
void __ac_pop_nonev();
void __eqdf2();
void __nedf2();
void __ltsf2();
void __nesf2();
void __gesf2();
void __gtsf2();
void __unordsf2();
void __truncdfhf2();
void __truncsfhf2();
#endif /* end of __CCAC__ */
void __ledf2();
void __ltdf2();
void __gedf2();
void __gtdf2();
void __eqsf2();
void __lesf2();
void __unorddf2();
/* clang-format on */
static SymbolMap target_sym_map[] = {
/* clang-format off */
REG_COMMON_SYMBOLS
#ifndef __CCAC__
REG_SYM(__st_r13_to_r15),
/* clang-format on */
REG_SYM(__st_r13_to_r16),
REG_SYM(__st_r13_to_r17),
REG_SYM(__st_r13_to_r18),
@ -91,22 +149,80 @@ static SymbolMap target_sym_map[] = {
REG_SYM(__divdi3),
REG_SYM(__divsf3),
REG_SYM(__divsi3),
REG_SYM(__eqsf2),
REG_SYM(__extendsfdf2),
REG_SYM(__fixdfsi),
REG_SYM(__floatsidf),
REG_SYM(__floatsisf),
REG_SYM(__gedf2),
REG_SYM(__gtdf2),
REG_SYM(__ledf2),
REG_SYM(__lesf2),
REG_SYM(__ltdf2),
REG_SYM(__muldf3),
REG_SYM(__mulsf3),
REG_SYM(__subdf3),
REG_SYM(__subsf3),
REG_SYM(__truncdfsf2),
#else
REG_SYM(__ac_push_13_to_13),
REG_SYM(__ac_push_13_to_14),
REG_SYM(__ac_push_13_to_15),
REG_SYM(__ac_push_13_to_16),
REG_SYM(__ac_push_13_to_17),
REG_SYM(__ac_push_13_to_18),
REG_SYM(__ac_push_13_to_19),
REG_SYM(__ac_push_13_to_20),
REG_SYM(__ac_push_13_to_21),
REG_SYM(__ac_push_13_to_22),
REG_SYM(__ac_push_13_to_23),
REG_SYM(__ac_push_13_to_24),
REG_SYM(__ac_push_13_to_25),
REG_SYM(__ac_push_13_to_26),
REG_SYM(__ac_push_none),
REG_SYM(__ac_pop_13_to_26),
REG_SYM(__ac_pop_13_to_26v),
REG_SYM(__ac_pop_13_to_25),
REG_SYM(__ac_pop_13_to_25v),
REG_SYM(__ac_pop_13_to_24),
REG_SYM(__ac_pop_13_to_24v),
REG_SYM(__ac_pop_13_to_23),
REG_SYM(__ac_pop_13_to_23v),
REG_SYM(__ac_pop_13_to_22),
REG_SYM(__ac_pop_13_to_22v),
REG_SYM(__ac_pop_13_to_21),
REG_SYM(__ac_pop_13_to_21v),
REG_SYM(__ac_pop_13_to_20),
REG_SYM(__ac_pop_13_to_20v),
REG_SYM(__ac_pop_13_to_19),
REG_SYM(__ac_pop_13_to_19v),
REG_SYM(__ac_pop_13_to_18),
REG_SYM(__ac_pop_13_to_18v),
REG_SYM(__ac_pop_13_to_17),
REG_SYM(__ac_pop_13_to_17v),
REG_SYM(__ac_pop_13_to_16),
REG_SYM(__ac_pop_13_to_16v),
REG_SYM(__ac_pop_13_to_15),
REG_SYM(__ac_pop_13_to_15v),
REG_SYM(__ac_pop_13_to_14),
REG_SYM(__ac_pop_13_to_14v),
REG_SYM(__ac_pop_13_to_13),
REG_SYM(__ac_pop_13_to_13v),
REG_SYM(__ac_pop_none),
REG_SYM(__ac_pop_nonev),
REG_SYM(__eqdf2),
REG_SYM(__nedf2),
REG_SYM(__ltsf2),
REG_SYM(__nesf2),
REG_SYM(__gesf2),
REG_SYM(__gtsf2),
REG_SYM(__unordsf2),
REG_SYM(__truncdfhf2),
REG_SYM(__truncsfhf2),
#endif /* end of __CCAC__ */
REG_SYM(__ledf2),
REG_SYM(__ltdf2),
REG_SYM(__gedf2),
REG_SYM(__gtdf2),
REG_SYM(__eqsf2),
REG_SYM(__lesf2),
REG_SYM(__unorddf2),
/* clang-format on */
};
static void
@ -168,6 +284,45 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr,
int32 symbol_index, char *error_buf, uint32 error_buf_size)
{
switch (reloc_type) {
case R_ARC_S25H_PCREL:
{
uint32 insn = LOAD_I32(target_section_addr + reloc_offset);
int32 addend, value;
uintptr_t S, P;
intptr_t A;
CHECK_RELOC_OFFSET(sizeof(void *));
/* Convert from middle endian */
insn = middle_endian_convert(insn);
addend = ((insn << 28) >> 28) << 10;
/* Extract the next 10 bits from Position 6 to 15 in insn */
addend |= ((insn << 16) >> 22);
addend = addend << 10;
/* Extract the remaining 10 bits from Position 17 to 26 in insn */
addend |= ((insn << 5) >> 22);
/* Fill in 1 bits to get the 25 bit Offset Value */
addend = addend << 1;
/* (S + A) - P */
S = (uintptr_t)(uint8 *)symbol_addr;
A = (intptr_t)reloc_addend;
P = (uintptr_t)(target_section_addr + reloc_offset);
P &= (uintptr_t)~1;
value = (int32)(S + A + addend - P);
insn = insn & 0xf8010030;
insn |= ((((value >> 1) & 0x3ff) << 17)
| (((value >> 1) & 0xffc00) >> 3)
| (((value >> 1) & 0xf00000) >> 19));
/* Convert to middle endian */
insn = middle_endian_convert(insn);
STORE_U32(target_section_addr + reloc_offset, insn);
break;
}
case R_ARC_S25W_PCREL:
{
uint32 insn = LOAD_I32(target_section_addr + reloc_offset);