weak function symbols
This commit is contained in:
parent
d63ec6f20d
commit
95b9a477b6
6 changed files with 32 additions and 3 deletions
11
examples/ex_weak.c
Executable file
11
examples/ex_weak.c
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#! /usr/local/bin/tcc -run
|
||||||
|
#include <tcclib.h>
|
||||||
|
|
||||||
|
extern void weak_f (void) __attribute__ ((weak));
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
if (weak_f) {
|
||||||
|
weak_f();
|
||||||
|
}
|
||||||
|
}
|
6
examples/weak_f.c
Normal file
6
examples/weak_f.c
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include <tcclib.h>
|
||||||
|
|
||||||
|
void weak_f (void)
|
||||||
|
{
|
||||||
|
printf("Weak\n");
|
||||||
|
}
|
4
libtcc.c
4
libtcc.c
|
@ -424,8 +424,12 @@ ST_FUNC void put_extern_sym2(Sym *sym, Section *section,
|
||||||
|
|
||||||
if (sym->type.t & VT_STATIC)
|
if (sym->type.t & VT_STATIC)
|
||||||
sym_bind = STB_LOCAL;
|
sym_bind = STB_LOCAL;
|
||||||
|
else {
|
||||||
|
if (FUNC_WEAK(sym->type.ref->r))
|
||||||
|
sym_bind = STB_WEAK;
|
||||||
else
|
else
|
||||||
sym_bind = STB_GLOBAL;
|
sym_bind = STB_GLOBAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!sym->c) {
|
if (!sym->c) {
|
||||||
name = get_tok_str(sym->v, NULL);
|
name = get_tok_str(sym->v, NULL);
|
||||||
|
|
4
tcc.h
4
tcc.h
|
@ -272,7 +272,8 @@ typedef struct AttributeDef {
|
||||||
func_import : 1,
|
func_import : 1,
|
||||||
func_args : 5,
|
func_args : 5,
|
||||||
mode : 4,
|
mode : 4,
|
||||||
fill : 12;
|
weak : 1,
|
||||||
|
fill : 11;
|
||||||
struct Section *section;
|
struct Section *section;
|
||||||
} AttributeDef;
|
} AttributeDef;
|
||||||
|
|
||||||
|
@ -283,6 +284,7 @@ typedef struct AttributeDef {
|
||||||
#define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args)
|
#define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args)
|
||||||
#define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned)
|
#define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned)
|
||||||
#define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed)
|
#define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed)
|
||||||
|
#define FUNC_WEAK(r) (((AttributeDef*)&(r))->weak)
|
||||||
#define ATTR_MODE(r) (((AttributeDef*)&(r))->mode)
|
#define ATTR_MODE(r) (((AttributeDef*)&(r))->mode)
|
||||||
#define INT_ATTR(ad) (*(int*)(ad))
|
#define INT_ATTR(ad) (*(int*)(ad))
|
||||||
|
|
||||||
|
|
4
tccgen.c
4
tccgen.c
|
@ -2462,6 +2462,10 @@ static void parse_attribute(AttributeDef *ad)
|
||||||
case TOK_PACKED2:
|
case TOK_PACKED2:
|
||||||
ad->packed = 1;
|
ad->packed = 1;
|
||||||
break;
|
break;
|
||||||
|
case TOK_WEAK1:
|
||||||
|
case TOK_WEAK2:
|
||||||
|
ad->weak = 1;
|
||||||
|
break;
|
||||||
case TOK_UNUSED1:
|
case TOK_UNUSED1:
|
||||||
case TOK_UNUSED2:
|
case TOK_UNUSED2:
|
||||||
/* currently, no need to handle it because tcc does not
|
/* currently, no need to handle it because tcc does not
|
||||||
|
|
2
tcctok.h
2
tcctok.h
|
@ -93,6 +93,8 @@
|
||||||
DEF(TOK_ALIGNED2, "__aligned__")
|
DEF(TOK_ALIGNED2, "__aligned__")
|
||||||
DEF(TOK_PACKED1, "packed")
|
DEF(TOK_PACKED1, "packed")
|
||||||
DEF(TOK_PACKED2, "__packed__")
|
DEF(TOK_PACKED2, "__packed__")
|
||||||
|
DEF(TOK_WEAK1, "weak")
|
||||||
|
DEF(TOK_WEAK2, "__weak__")
|
||||||
DEF(TOK_UNUSED1, "unused")
|
DEF(TOK_UNUSED1, "unused")
|
||||||
DEF(TOK_UNUSED2, "__unused__")
|
DEF(TOK_UNUSED2, "__unused__")
|
||||||
DEF(TOK_CDECL1, "cdecl")
|
DEF(TOK_CDECL1, "cdecl")
|
||||||
|
|
Loading…
Reference in a new issue