말 그대로 리턴하지 않겠다는 것을 컴파일러에게 알려주는 코드입니다.
C 언어 컴파일러가 코드를 컴파일 하면 함수는 반드시 리턴해야 합니다.
그리고 함수를 시작할 때 함수에서 사용하는 레지스터를 백업하고,
함수 끝날 때 리턴 직전에 레지스터를 리스토어하는 코드가 들어갑니다.
코드에 return 표현식을 쓰지 않아도(void 함수) 컴파일러는 해당 아키텍처에 맞는 리턴 어셈블리 명령어를 함수 끝에 추가해서 리턴 어드래스 (ARM의 경우 ld 레지스터)에 기록된 메모리 위치로 되돌아갑니다.
그런데 __noreturn 을 함수 선언에 사용하면 컴파일러는 레지스터를 백업/리스토어하는 코드와 이 리턴하는 어셈블리 명령어를 만들지 않습니다.
https://elixir.bootlin.com
https://elixir.bootlin.com/linux/v5.15.2/source/include/linux/compiler_attributes.h#L249
프로그래머의 의도를 더 정확하게 반영하거나 최적화를 더 잘 하기 위한 컴파일러 확장 문법 되겠습니다.
https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
말 그대로 리턴하지 않겠다는 것을 컴파일러에게
말 그대로 리턴하지 않겠다는 것을 컴파일러에게 알려주는 코드입니다.
C 언어 컴파일러가 코드를 컴파일 하면 함수는 반드시 리턴해야 합니다.
그리고 함수를 시작할 때 함수에서 사용하는 레지스터를 백업하고,
함수 끝날 때 리턴 직전에 레지스터를 리스토어하는 코드가 들어갑니다.
코드에 return 표현식을 쓰지 않아도(void 함수) 컴파일러는 해당 아키텍처에 맞는 리턴 어셈블리 명령어를 함수 끝에 추가해서 리턴 어드래스 (ARM의 경우 ld 레지스터)에 기록된 메모리 위치로 되돌아갑니다.
그런데 __noreturn 을 함수 선언에 사용하면 컴파일러는 레지스터를 백업/리스토어하는 코드와 이 리턴하는 어셈블리 명령어를 만들지 않습니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기