Fix another corner case with C/asm symtable
[tinycc.git] / c67-link.c
blobde72e442f85b3b3c7bcae3d9e2e242e32952cf34
1 #ifdef TARGET_DEFS_ONLY
3 #define EM_TCC_TARGET EM_C60
5 /* relocation type for 32 bit data relocation */
6 #define R_DATA_32 R_C60_32
7 #define R_DATA_PTR R_C60_32
8 #define R_JMP_SLOT R_C60_JMP_SLOT
9 #define R_GLOB_DAT R_C60_GLOB_DAT
10 #define R_COPY R_C60_COPY
11 #define R_RELATIVE R_C60_RELATIVE
13 #define R_NUM R_C60_NUM
15 #define ELF_START_ADDR 0x00000400
16 #define ELF_PAGE_SIZE 0x1000
18 #define PCRELATIVE_DLLPLT 0
19 #define RELOCATE_DLLPLT 0
21 #else /* !TARGET_DEFS_ONLY */
23 #include "tcc.h"
25 /* Returns 1 for a code relocation, 0 for a data relocation. For unknown
26 relocations, returns -1. */
27 int code_reloc (int reloc_type)
29 switch (reloc_type) {
30 case R_C60_32:
31 case R_C60LO16:
32 case R_C60HI16:
33 case R_C60_GOT32:
34 case R_C60_GOTOFF:
35 case R_C60_GOTPC:
36 case R_C60_COPY:
37 return 0;
39 case R_C60_PLT32:
40 return 1;
43 tcc_error ("Unknown relocation type: %d", reloc_type);
44 return -1;
47 /* Returns an enumerator to describe whether and when the relocation needs a
48 GOT and/or PLT entry to be created. See tcc.h for a description of the
49 different values. */
50 int gotplt_entry_type (int reloc_type)
52 switch (reloc_type) {
53 case R_C60_32:
54 case R_C60LO16:
55 case R_C60HI16:
56 case R_C60_COPY:
57 return NO_GOTPLT_ENTRY;
59 case R_C60_GOTOFF:
60 case R_C60_GOTPC:
61 return BUILD_GOT_ONLY;
63 case R_C60_PLT32:
64 case R_C60_GOT32:
65 return ALWAYS_GOTPLT_ENTRY;
68 tcc_error ("Unknown relocation type: %d", reloc_type);
69 return -1;
72 ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr)
74 tcc_error("C67 got not implemented");
75 return 0;
78 /* relocate the PLT: compute addresses and offsets in the PLT now that final
79 address for PLT and GOT are known (see fill_program_header) */
80 ST_FUNC void relocate_plt(TCCState *s1)
82 uint8_t *p, *p_end;
84 if (!s1->plt)
85 return;
87 p = s1->plt->data;
88 p_end = p + s1->plt->data_offset;
90 if (p < p_end) {
91 /* XXX: TODO */
92 while (p < p_end) {
93 /* XXX: TODO */
98 void relocate_init(Section *sr) {}
100 void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val)
102 switch(type) {
103 case R_C60_32:
104 *(int *)ptr += val;
105 break;
106 case R_C60LO16:
108 uint32_t orig;
110 /* put the low 16 bits of the absolute address add to what is
111 already there */
112 orig = ((*(int *)(ptr )) >> 7) & 0xffff;
113 orig |= (((*(int *)(ptr+4)) >> 7) & 0xffff) << 16;
115 /* patch both at once - assumes always in pairs Low - High */
116 *(int *) ptr = (*(int *) ptr & (~(0xffff << 7)) ) |
117 (((val+orig) & 0xffff) << 7);
118 *(int *)(ptr+4) = (*(int *)(ptr+4) & (~(0xffff << 7)) ) |
119 ((((val+orig)>>16) & 0xffff) << 7);
121 break;
122 case R_C60HI16:
123 break;
124 default:
125 fprintf(stderr,"FIXME: handle reloc type %x at %x [%p] to %x\n",
126 type, (unsigned) addr, ptr, (unsigned) val);
127 break;
131 #endif /* !TARGET_DEFS_ONLY */