10.31 __attribute__((alias)) 関数属性

この関数属性を使用すると、1 つの関数に複数エイリアスを指定できます。

エイリアスは、元の関数と同じ変換単位内で定義されている必要があります。

ブロックスコープでは、エイリアスを指定できません。コンパイラは、ローカル関数定義に関連付けられているエイリアス生成属性を無視し、関数定義を通常のローカル定義として扱います。
出力オブジェクトファイル内では、コンパイラは、エイリアスの呼び出しを元の関数名の呼び出しに置換し、エイリアスが元の名前と共に生成されます。以下に例を示します。
static int oldname(int x, int y) {
     return x + y;
}
static int newname(int x, int y) __attribute__((alias("oldname")));
int caller(int x, int y) {
     return oldname(x,y) + newname(x,y);
}
このコードは以下のようにコンパイルされます。
AREA ||.text||, CODE, READONLY, ALIGN=2
newname                  ; Alternate entry point
oldname PROC
     MOV      r2,r0
     ADD      r0,r2,r1
     BX       lr
     ENDP
caller PROC
     PUSH     {r4,r5,lr}
     MOV      r3,r0
     MOV      r4,r1
     MOV      r1,r4
     MOV      r0,r3
     BL       oldname
     MOV      r5,r0
     MOV      r1,r4
     MOV      r0,r3
     BL       oldname
     ADD      r0,r0,r5
     POP      {r4,r5,pc}
     ENDP

この関数属性は、ARM コンパイラがサポートする GNU コンパイラ拡張機能です。

変数名は、対応する変数属性 __attribute__((alias)) を使用してエイリアスされる可能性があります。

構文

return-type newname ([argument-list]) __attribute__((alias(" oldname ")));
各項目には以下の意味があります。
oldname
エイリアスされる関数の名前を指定します。
newname
エイリアスされる関数の新しい名前を指定します。

#include <stdio.h>
void foo(void)
{
    printf("%s\n", __FUNCTION__);
}
void bar(void) __attribute__((alias("foo")));
void gazonk(void)
{
    bar(); // calls foo
}
関連する参考文書
10.63 __attribute__((alias)) 変数属性
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.