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.
This commit is contained in:
Thomas Preud'homme
2012-11-04 00:40:05 +01:00
parent e07802e39d
commit 891dfcdf3f
2 changed files with 61 additions and 26 deletions

11
tcc.h
View File

@ -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;