GCC 플러그인에 내장 함수를 추가하는 방법
GCC 플러그인으로 새로운 빌트인 기능을 추가할 수 있습니까?그렇다면 어떻게 하면 좋을까요?
GCC 버전은 5.3(또는 그 이후)입니다.코드는 C로 작성된 플러그인에 의해 컴파일 및 처리됩니다.
gcc-melt.org의 GCC 플러그인에 대한 근거에 이것이 가능하다고 언급되어 있습니다만, 그 방법을 알 수 없습니다.
GCC의 소스에서 볼 수 있는 한 빌트인은 다음과 같이 생성됩니다.add_builtin_function()
gcc/sublichooks.c부터:
tree
add_builtin_function (const char *name,
tree type,
int function_code,
enum built_in_class cl,
const char *library_name,
tree attrs)
이 함수의 인수가 가져야 하는 값은 다음과 같은 경우를 제외하고 어느 정도 명확합니다.function_code
함수의 고유 숫자 ID입니다.
(을 참조)add_builtin_function_common()
)의 값enum built_in_function
GCC 플러그인은 이 열거형을 변경할 수 없습니다.
다음 값보다 큰 임의의 값은 전달할 수 없습니다.END_BUILTINS
~하듯이function_code
둘 중 어느 쪽이든. builtin_decl_implicit()
그리고.builtin_decl_explicit()
이 경우 실패한 주장을 하게 됩니다.
그렇다면 (MELT 등의 GCC 플러그인 API를 사용하지 않고) GCC 플러그인에 빌트인을 추가하는 적절한 방법은 무엇일까요?
업데이트 나는 다음 구현에 대해 다시 살펴봤다.add_builtin_function_common()
및 의langhooks.builtin_function()
C 및 GCC에서의 사용 방법에 대해 설명합니다.0은 다음과 같이 허용될 수 있습니다.function_code
경우에 따라서는.사용할 수 없습니다.builtin_decl_implicit()
DECL을 저장해 둘 수 있습니다.add_builtin_function()
나중에 쓰세요.
이러한 방법으로 빌트인을 작성할 수 있는 유일한 이벤트는 PLUGIN_START_UNIT입니다(그렇지 않으면 GCC가 다음 이유로 크래쉬할 수 있습니다).external_scope
변수는 NULL).
그 단계에서 다음을 시도했습니다.fntype
이전에 작성되었습니다).
decl = add_builtin_function (
"my_helper", fntype,
0 /* function_code */,
BUILT_IN_NORMAL /* enum built_in_class cl */,
NULL /* library_name */,
NULL_TREE /* attrs */)
my_helper
는 다른 C 소스 파일에 정의되어 메인 소스 파일과 링크되어 있습니다.그런 다음 decl을 사용하여 해당 함수에 대한 호출을 다른 함수에 삽입했습니다.gimple_build_call
GIMPLE 패스 중).
GCC는 에러를 출력하지 않고, 실제로 콜을 에 삽입했습니다.my_helper
일반적인 기능에 대한 호출입니다.실제로 전화를 피하기 위해 기능 본문을 삽입하기 위해 빌트인이 필요했습니다.
반면에,tsan0
pass는 패스 직후에 실행되며 내장 함수의 콜이 예상대로 삽입됩니다.그 결과 명시적인 콜은 없고 함수의 본문만 삽입됩니다.단, 빌트인은 플러그인이 아닌 GCC 자체에 의해 정의됩니다.
그래서 내 빌트인이 유효한 빌트인이 되려면 아직 뭔가가 필요한 것 같은데 그게 뭔지 모르겠어.그게 뭘까요?
(당신의 코멘트나 링크 투고로부터) C코드를 함수에 삽입하는 것이 목적이라고 생각합니다.이 경우 컴파일러 플러그인까지 쓸 필요는 없다고 생각합니다.Boost를 보세요.프리프로세서: 프리프로세서만을 사용하여 C 코드의 고도의 조작을 실행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/39279024/how-to-add-a-builtin-function-in-a-gcc-plugin
'programing' 카테고리의 다른 글
RowDataPacket 객체에 액세스하는 방법 (0) | 2022.10.19 |
---|---|
왜 MariaDB의 CHECK 문은 Linux가 아닌 Windows에서 작동합니까? (0) | 2022.10.19 |
Eclipse: 어설션 활성화 (0) | 2022.10.19 |
목록 초기화용 이 코드가 목록을 서로 링크하는 이유는 무엇입니까? (0) | 2022.10.19 |
라이브러리가 로드되지 않음: mysql2 gem을 사용하여 OS X 10.6에서 'rails server'를 실행하려고 하면 libmysqlclient.16.dylib 오류가 발생함 (0) | 2022.10.19 |