History

Implement __attribute__((nodecorate))

Prevent any decoration that would otherwise affect an exported PE function. For example, given the following: __declspec(dllexport) __stdcall int decorated(int arg) { return 0; } __declspec(dllexport) __stdcall __attribute__((nodecorate)) int undecorated(int arg) { return 0; } The following exported functions can now be seen in the DLL: _decorated@4 undecorated The attribute is recognised for all targets but only affects PE codegen. I'm not sure whether this would be useful for other targets; its intended use was to allow the creation of a DLL matching an existing set of signatures.

Jonathan Newman committed 8 years ago

Commit 0edbed11 parent d79caa94 files · +12 −1Browse files

Unified · Split

4 files
  1. tcc-doc.texi +3 −0
  2. tcc.h +2 −1
  3. tccgen.c +6 −0
  4. tcctok.h +1 −0
tcc-doc.texi+3−0
@@ -548,6 +548,7 @@ instead of · 547 unmodified lines
548@cindex stdcall attribute548@cindex stdcall attribute
549@cindex regparm attribute549@cindex regparm attribute
550@cindex dllexport attribute550@cindex dllexport attribute
551@cindex nodecorate attribute
551 552
552@item The keyword @code{__attribute__} is handled to specify variable or553@item The keyword @code{__attribute__} is handled to specify variable or
553function attributes. The following attributes are supported:554function attributes. The following attributes are supported:
@@ -575,6 +576,8 @@ registers @code{%eax}, @code{%edx} and @code{%ecx}. · 21 unmodified lines
575 576
576 @item @code{dllexport}: export function from dll/executable (win32 only)577 @item @code{dllexport}: export function from dll/executable (win32 only)
577 578
579 @item @code{nodecorate}: do not apply any decorations that would otherwise be applied when exporting function from dll/executable (win32 only)
580
578 @end itemize581 @end itemize
579 582
580Here are some examples:583Here are some examples:
tcc.h+2−1
@@ -439,8 +439,9 @@ struct SymAttr { · 438 unmodified lines
439 weak : 1,439 weak : 1,
440 visibility : 2,440 visibility : 2,
441 dllexport : 1,441 dllexport : 1,
442 nodecorate : 1,
442 dllimport : 1,443 dllimport : 1,
443 unused : 5;444 unused : 4;
444};445};
445 446
446/* function attributes or temporary attributes for parsing */447/* function attributes or temporary attributes for parsing */
tccgen.c+6−0
@@ -391,6 +391,9 @@ ST_FUNC void put_extern_sym2(Sym *sym, int sh_num, · 390 unmodified lines
391#ifdef TCC_TARGET_PE391#ifdef TCC_TARGET_PE
392 if (sym_type == STT_FUNC && sym->type.ref) {392 if (sym_type == STT_FUNC && sym->type.ref) {
393 Sym *ref = sym->type.ref;393 Sym *ref = sym->type.ref;
394 if (ref->a.nodecorate) {
395 can_add_underscore = 0;
396 }
394 if (ref->f.func_call == FUNC_STDCALL && can_add_underscore) {397 if (ref->f.func_call == FUNC_STDCALL && can_add_underscore) {
395 sprintf(buf1, "_%s@%d", name, ref->f.func_args * PTR_SIZE);398 sprintf(buf1, "_%s@%d", name, ref->f.func_args * PTR_SIZE);
396 name = buf1;399 name = buf1;
@@ -3438,6 +3441,9 @@ redo: · 3041 unmodified lines
3438 case TOK_DLLEXPORT:3441 case TOK_DLLEXPORT:
3439 ad->a.dllexport = 1;3442 ad->a.dllexport = 1;
3440 break;3443 break;
3444 case TOK_NODECORATE:
3445 ad->a.nodecorate = 1;
3446 break;
3441 case TOK_DLLIMPORT:3447 case TOK_DLLIMPORT:
3442 ad->a.dllimport = 1;3448 ad->a.dllimport = 1;
3443 break;3449 break;
tcctok.h+1−0
@@ -132,6 +132,7 @@ · 131 unmodified lines
132 132
133 DEF(TOK_DLLEXPORT, "dllexport")133 DEF(TOK_DLLEXPORT, "dllexport")
134 DEF(TOK_DLLIMPORT, "dllimport")134 DEF(TOK_DLLIMPORT, "dllimport")
135 DEF(TOK_NODECORATE, "nodecorate")
135 DEF(TOK_NORETURN1, "noreturn")136 DEF(TOK_NORETURN1, "noreturn")
136 DEF(TOK_NORETURN2, "__noreturn__")137 DEF(TOK_NORETURN2, "__noreturn__")
137 DEF(TOK_VISIBILITY1, "visibility")138 DEF(TOK_VISIBILITY1, "visibility")

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t