diff options
| author | Thomas Preud'homme <robotux@celest.fr> | 2012-11-04 00:40:05 +0100 |
|---|---|---|
| committer | Thomas Preud'homme <robotux@celest.fr> | 2012-11-07 20:51:33 +0100 |
| commit | 891dfcdf3fc441a1863c43d179dc6e0e4d65836f (patch) | |
| tree | d1e90545bf0b49c3d7cb65487663077892b3e1ba /tcc.h | |
| parent | e07802e39d415951ff4a57e12de9b1855d8b0d77 (diff) | |
| download | tinycc-891dfcdf3fc441a1863c43d179dc6e0e4d65836f.tar.gz tinycc-891dfcdf3fc441a1863c43d179dc6e0e4d65836f.tar.bz2 | |
Generate PLT thumb stub only when necessary
Generate PLT thumb stub for an ARM PLT entry only when at least one
Thumb instruction branches to that entry.
Warning: To save space, this commit reuses the bit 0 of entries of
got_offsets array. The GOT offset is thus saved in a 31 bit value.
Make sure to divide by 2 (right shift by 1) an offset before storing it
there and conversely to multiply the value by 2 (left shift by 1) before
using it.
Diffstat (limited to 'tcc.h')
| -rw-r--r-- | tcc.h | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -33,6 +33,7 @@ #include <stdlib.h> #include <stdio.h> +#include <limits.h> #include <stdarg.h> #include <string.h> #include <errno.h> @@ -524,11 +525,15 @@ struct TCCState { Section **priv_sections; int nb_priv_sections; /* number of private sections */ - /* got handling */ + /* got & plt handling */ Section *got; Section *plt; - unsigned long *got_offsets; - int nb_got_offsets; + struct { + unsigned long plt_thumb_stub:1; + /* mult by 2 (or left shift by 1) before use */ + unsigned long got_offset:(sizeof(long)*CHAR_BIT-1); + } *sym_infos; + int nb_sym_infos; /* give the correspondance from symtab indexes to dynsym indexes */ int *symtab_to_dynsym; |
