aboutsummaryrefslogtreecommitdiff
path: root/tinycc/c67-link.c
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-07-12 13:22:29 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-07-12 13:22:29 -0300
commitfa2bdd711212ba6b7a94a20971e8bfa281e73296 (patch)
tree6713b3c0379507d49558287b71dd360ce188a2f0 /tinycc/c67-link.c
lol
Diffstat (limited to 'tinycc/c67-link.c')
-rw-r--r--tinycc/c67-link.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/tinycc/c67-link.c b/tinycc/c67-link.c
new file mode 100644
index 0000000..8e7a8b2
--- /dev/null
+++ b/tinycc/c67-link.c
@@ -0,0 +1,125 @@
+#ifdef TARGET_DEFS_ONLY
+
+#define EM_TCC_TARGET EM_C60
+
+/* relocation type for 32 bit data relocation */
+#define R_DATA_32 R_C60_32
+#define R_DATA_PTR R_C60_32
+#define R_JMP_SLOT R_C60_JMP_SLOT
+#define R_GLOB_DAT R_C60_GLOB_DAT
+#define R_COPY R_C60_COPY
+#define R_RELATIVE R_C60_RELATIVE
+
+#define R_NUM R_C60_NUM
+
+#define ELF_START_ADDR 0x00000400
+#define ELF_PAGE_SIZE 0x1000
+
+#define PCRELATIVE_DLLPLT 0
+#define RELOCATE_DLLPLT 0
+
+#else /* !TARGET_DEFS_ONLY */
+
+#include "tcc.h"
+
+/* Returns 1 for a code relocation, 0 for a data relocation. For unknown
+ relocations, returns -1. */
+int code_reloc (int reloc_type)
+{
+ switch (reloc_type) {
+ case R_C60_32:
+ case R_C60LO16:
+ case R_C60HI16:
+ case R_C60_GOT32:
+ case R_C60_GOTOFF:
+ case R_C60_GOTPC:
+ case R_C60_COPY:
+ return 0;
+
+ case R_C60_PLT32:
+ return 1;
+ }
+ return -1;
+}
+
+/* Returns an enumerator to describe whether and when the relocation needs a
+ GOT and/or PLT entry to be created. See tcc.h for a description of the
+ different values. */
+int gotplt_entry_type (int reloc_type)
+{
+ switch (reloc_type) {
+ case R_C60_32:
+ case R_C60LO16:
+ case R_C60HI16:
+ case R_C60_COPY:
+ return NO_GOTPLT_ENTRY;
+
+ case R_C60_GOTOFF:
+ case R_C60_GOTPC:
+ return BUILD_GOT_ONLY;
+
+ case R_C60_PLT32:
+ case R_C60_GOT32:
+ return ALWAYS_GOTPLT_ENTRY;
+ }
+ return -1;
+}
+
+ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr)
+{
+ tcc_error_noabort("C67 got not implemented");
+ return 0;
+}
+
+/* relocate the PLT: compute addresses and offsets in the PLT now that final
+ address for PLT and GOT are known (see fill_program_header) */
+ST_FUNC void relocate_plt(TCCState *s1)
+{
+ uint8_t *p, *p_end;
+
+ if (!s1->plt)
+ return;
+
+ p = s1->plt->data;
+ p_end = p + s1->plt->data_offset;
+
+ if (p < p_end) {
+ /* XXX: TODO */
+ while (p < p_end) {
+ /* XXX: TODO */
+ }
+ }
+}
+
+void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val)
+{
+ switch(type) {
+ case R_C60_32:
+ *(int *)ptr += val;
+ break;
+ case R_C60LO16:
+ {
+ uint32_t orig;
+
+ /* put the low 16 bits of the absolute address add to what is
+ already there */
+ orig = ((*(int *)(ptr )) >> 7) & 0xffff;
+ orig |= (((*(int *)(ptr+4)) >> 7) & 0xffff) << 16;
+
+ /* patch both at once - assumes always in pairs Low - High */
+ *(int *) ptr = (*(int *) ptr & (~(0xffff << 7)) ) |
+ (((val+orig) & 0xffff) << 7);
+ *(int *)(ptr+4) = (*(int *)(ptr+4) & (~(0xffff << 7)) ) |
+ ((((val+orig)>>16) & 0xffff) << 7);
+ }
+ break;
+ case R_C60HI16:
+ break;
+ default:
+ fprintf(stderr,"FIXME: handle reloc type %x at %x [%p] to %x\n",
+ type, (unsigned) addr, ptr, (unsigned) val);
+ break;
+ }
+}
+
+#endif /* !TARGET_DEFS_ONLY */