AMD64 타깃과 ABI

Linux AMD64 타깃 속성, 호출 경계와 native 기능 범위를 설명합니다.

Wave Foundation

타깃 식별자

native 프로파일의 타깃 식별자는 x86_64-whale-linux입니다.

속성
운영체제 Linux
명령 집합 AMD64
바이트 순서 Little endian
Native 주소 폭 64비트
오브젝트 형식 ELF64
C 호출 규약 SysV AMD64 ABI
정적 실행 파일 형식 ELF ET_EXEC

빌드 호스트와 출력 타깃은 서로 다른 개념입니다. 다른 호스트에서 Whale을 실행할 수 있다고 해당 호스트의 명령 집합이나 오브젝트 형식을 출력할 수 있는 것은 아닙니다. 구현된 컴파일 경로는 지원 현황을 참고하세요.

호출과 서명

지원되는 호출에는 명시적인 서명과 호출 규약이 필요합니다. 미지원 서명은 오류입니다. 백엔드는 인자를 누락하거나 다른 표현으로 대체해 비슷한 호출을 만들어서는 안 됩니다.

서명 지원은 기본 정수·포인터, f32/f64, 구조체·넓은 값, 가변 인자로 구분합니다. IR 타입 체계에 타입이 있다고 해당 타입의 인자 전달이나 반환까지 ABI에서 지원된다는 뜻은 아닙니다. 백엔드를 선택할 때 필요한 범주의 지원 여부를 각각 확인해야 합니다.

예를 들어 i32 반환을 처리하는 백엔드도 지원하지 않는 구조체 반환 서명은 거부해야 합니다. 구조체의 일부가 스칼라 레지스터에 들어간다는 이유로 스칼라 반환 규약을 적용할 수는 없습니다.

내부 호출과 C 경계

native 포인터 주소는 64비트입니다. 추적 포인터의 shadow metadata는 복사·저장·인자·반환을 거쳐도 함께 전달되어야 합니다.

C ABI와 내부 메타데이터 전달 규약은 구별됩니다. C 경계를 넘는 호출에는 명시적 어댑터가 필요합니다. 숫자 주소를 C ABI로 전달했다는 이유만으로 할당 정체성·수명·범위·접근 권한이 보존되었다고 간주해서는 안 됩니다.

스택 프레임

프레임 포인터를 유지하며 red zone을 사용하지 않습니다. O0에서는 서로 다른 지역변수의 저장 공간을 재사용하지 않습니다. 호출 프레임 디버그 정보는 native 프레임과 원래 프로그램의 대응을 설명합니다.

이 규칙은 디버깅을 위한 것이며 예외 unwinding 지원을 의미하지 않습니다. O0와 디버깅을 참고하세요.

프로파일 제한

첫 O0 native 프로파일에는 다음 기능을 포함하지 않습니다.

  • O1 이상 최적화, 벡터화, LTO.
  • 공유 메모리와 atomic 연산.
  • 예외 unwinding, async 함수, coroutine.
  • GC와 언어별 소유권 검사.
  • 임의 외부 메모리의 소유권 이전.
  • 전체 인라인 어셈블리 제약 지원.
  • 동적 링크, TLS, 추가 명령 집합, 추가 오브젝트 형식.

지원 범위를 벗어나는 요청은 다른 기능으로 조용히 대체하지 않고 거부해야 합니다. 이 제한은 native 컴파일 경로에 대한 것이며 독립적으로 제공되는 다른 툴체인 구성 요소를 제거한다는 뜻은 아닙니다.