کتابخانه‌ی استاندارد · کامپایلر و ابزار

سه‌گانه هدف llvm/triple

آرایش داده و ویژگی‌های هدف از روی سه‌تایی، بی نیاز به LLVM.

واردسازی ال ال وی ام.سه‌گانه هدف

سه‌تایی هدف، مثل x86_64-unknown-linux-gnu، معماری، سازنده، سیستم‌عامل و محیط را نام می‌برد. این بسته بی پیوند با LLVM از روی آن اطلاعاتی را می‌دهد که کامپایلر پیش از تولید کد لازم دارد، مثل اندازه‌ی اشاره‌گر و آرایش داده.

بخش‌ها با خط تیره از هم جدا می‌شوند و بخش‌های آخر ممکن است نباشند: x86_64-linux-musl سازنده ندارد و aarch64-apple-darwin محیط. تابع‌های این بسته فقط متن را می‌خوانند، پس روی هر ماشینی یکسان کار می‌کنند، حتی برای هدف‌هایی که نمی‌توانید رویشان اجرا کنید؛ همان چیزی که یک کامپایلر متقاطع لازم دارد. پشتیبان LLVM خود سلام هم با همین تابع‌ها آرایش داده و کتابخانه‌ی C هدف را انتخاب می‌کند. برای ساختن ماشین هدف واقعی LLVM از روی یک سه‌تایی، از ال ال وی ام استفاده کنید.

نکته‌هایی که باید بدانید

  • تابع‌ها واژه‌های شناخته‌شده‌ای مثل x86_64، windows یا musl را در هر جای سه‌تایی جست‌وجو می‌کنند و درستی آن را نمی‌سنجند: سه‌تایی‌ای که غلط نوشته شود بی‌صدا پاسخ نادرست می‌گیرد.
  • سه‌تایی خالی یعنی ماشین میزبان. معماری‌ای هم که بیت‌های اشاره‌گر نشناسد همین حکم را دارد: به جای گزارش خطا، اندازه‌ی اشاره‌گر میزبان برمی‌گردد.
  • آرایش داده این‌ها را می‌شناسد: x86-64 (لینوکس، ویندوز و مک)، x86 سی‌ودو بیتی بیرون از ویندوز و مک، AArch64، RISC-V 64 و ARM سی‌ودو بیتی. برای بقیه، از جمله وب‌اسمبلی، رشته‌ی خالی برمی‌گرداند. ویندوز روی ARM آرایش AArch64 لینوکس را می‌گیرد.
  • گلیبسی است یعنی «لینوکس و نه musl». سه‌تایی اندروید مثل aarch64-linux-android واژه‌ی linux را دارد، پس با این که اندروید از Bionic استفاده می‌کند glibc به حساب می‌آید.

چیدن یک ساختار برای هدفی دیگر

اندازه‌ی اشاره‌گر اندازه‌ی هر ساختاری را که اشاره‌گر دارد تعیین می‌کند و در نتیجه هر جابه‌جایی‌ای را که تولیدکننده‌ی کد می‌نویسد. بیت‌های اشاره‌گر آن را برای هر سه‌تایی می‌دهد. برنامه‌ی زیر گره‌ی یک فهرست را می‌چیند که یک اشاره‌گر به نام، یک سن ۳۲ بیتی و یک اشاره‌گر به گره بعدی دارد، و مثل C هر فیلد را هم‌اندازه‌ی خودش هم‌تراز می‌کند.

llvm-triple-guide-sizes.salam
واردسازی ال ال وی ام.سه‌گانه هدف

تابع گرد به بالا(عدد: صحیح، هم‌ترازی: صحیح): صحیح:
    برگشت (عدد + هم‌ترازی - ۱) / هم‌ترازی * هم‌ترازی
پایان

تابع اندازه گره(هدف: رشته): صحیح:
    اشاره‌گر := سه‌گانه هدف.بیت‌های اشاره‌گر(هدف) / ۸
    ناپایا اندازه := اشاره‌گر
    اندازه = گرد به بالا(اندازه، ۴) + ۴
    اندازه = گرد به بالا(اندازه، اشاره‌گر) + اشاره‌گر
    برگشت گرد به بالا(اندازه، اشاره‌گر)
پایان

تابع ریشه:
    هر هدف در ["x86_64-unknown-linux-gnu"، "i686-unknown-linux-gnu"، "wasm32-unknown-wasi"، "aarch64-apple-darwin"]:
        سرچاپ هدف، "اشاره‌گر"، سه‌گانه هدف.بیت‌های اشاره‌گر(هدف)، "بیتی، گره"، اندازه گره(هدف)، "بایت"
    پایان
پایان
خروجیx86_64-unknown-linux-gnu اشاره‌گر 64 بیتی، گره 24 بایت i686-unknown-linux-gnu اشاره‌گر 32 بیتی، گره 12 بایت wasm32-unknown-wasi اشاره‌گر 32 بیتی، گره 12 بایت aarch64-apple-darwin اشاره‌گر 64 بیتی، گره 24 بایت

گره روی هدف‌های ۶۴ بیتی دو برابر است: دو اشاره‌گر هشت بایتی و یک عدد چهار بایتی که تا هشت پر می‌شود. روی هدف ۳۲ بیتی، از جمله وب‌اسمبلی، هر فیلد چهار بایت است و پرکردنی در کار نیست. برای پاسخ دقیق درباره‌ی هر گونه، رشته‌ی آرایش داده را به LLVM بدهید، همان کاری که بسته‌ی ال ال وی ام می‌کند.

انتخاب نام فایل و کتابخانه‌ی C

ابزار ساخت چند تصمیم را مستقیم از روی سه‌تایی می‌گیرد: برنامه‌های ویندوز با .exe تمام می‌شوند، برنامه‌ی glibc هر جا اجرا شود glibc سازگار لازم دارد، و برنامه‌ی musl را می‌شود کاملا ایستا پیوند داد و روی هر لینوکسی کپی کرد. ویندوز است و گلیبسی است دو پرسش اول را پاسخ می‌دهند؛ بقیه را می‌شود با رشته از خود سه‌تایی خواند.

llvm-triple-guide-output.salam
واردسازی ال ال وی ام.سه‌گانه هدف
واردسازی رشته

تابع نام خروجی(نام: رشته، هدف: رشته): رشته:
    اگر سه‌گانه هدف.ویندوز است(هدف):
        برگشت نام + ".exe"
    پایان
    برگشت نام
پایان

تابع یادداشت کتابخانه(هدف: رشته): رشته:
    اگر سه‌گانه هدف.ویندوز است(هدف):
        برگشت "با کتابخانه‌ی C ویندوز پیوند می‌خورد"
    وگرنه سه‌گانه هدف.گلیبسی است(هدف):
        برگشت "روی ماشین مقصد glibc لازم دارد"
    وگرنه رشته.شامل است(هدف، "musl"):
        برگشت "می‌تواند کاملا ایستا باشد"
    پایان
    برگشت "از کتابخانه‌ی C سیستم استفاده می‌کند"
پایان

تابع ریشه:
    هر هدف در ["x86_64-unknown-linux-gnu"، "x86_64-linux-musl"، "x86_64-w64-windows-gnu"، "aarch64-apple-darwin"]:
        سرچاپ نام خروجی("app"، هدف)، "برای"، هدف
        سرچاپ "  " + یادداشت کتابخانه(هدف)
    پایان
پایان
خروجیapp برای x86_64-unknown-linux-gnu روی ماشین مقصد glibc لازم دارد app برای x86_64-linux-musl می‌تواند کاملا ایستا باشد app.exe برای x86_64-w64-windows-gnu با کتابخانه‌ی C ویندوز پیوند می‌خورد app برای aarch64-apple-darwin از کتابخانه‌ی C سیستم استفاده می‌کند

وقتی آرایش داده رشته‌ی خالی برمی‌گرداند، هدف برای این بسته ناشناخته است. این خطا نیست: آرایش داده را در ماژول نگذارید تا LLVM پیش‌فرض خودش را برای آن سه‌تایی بگذارد.

بسته درباره‌ی یک هدف چه می‌داند

این برنامه از همه‌ی تابع‌ها درباره‌ی شش هدف می‌پرسد. نخستین حرف رشته‌ی آرایش داده ترتیب بایت است: e برای کوچک‌پایان و E برای بزرگ‌پایان. بقیه‌ی رشته، به قالب خود LLVM، اندازه و هم‌ترازی اشاره‌گرها و گونه‌های عددی را می‌گوید.

llvm-triple-guide-layout.salam
واردسازی ال ال وی ام.سه‌گانه هدف
واردسازی رشته

تابع ترتیب بایت(آرایش: رشته): رشته:
    اگر آرایش.طول() == ۰:
        برگشت "نامعلوم"
    پایان
    اگر رشته.شروع با(آرایش، "E"):
        برگشت "بزرگ‌پایان"
    پایان
    برگشت "کوچک‌پایان"
پایان

تابع ریشه:
    هدف‌ها := ["x86_64-pc-windows-msvc"، "aarch64-apple-darwin"، "riscv64-unknown-linux-gnu"، "armeb-unknown-linux-gnueabi"، "wasm32-unknown-wasi"، "aarch64-linux-android"]
    هر هدف در هدف‌ها:
        آرایش := سه‌گانه هدف.آرایش داده(هدف)
        سرچاپ هدف
        سرچاپ "  اشاره‌گر:"، سه‌گانه هدف.بیت‌های اشاره‌گر(هدف)، "بیتی،"، ترتیب بایت(آرایش)
        سرچاپ "  ویندوز:"، سه‌گانه هدف.ویندوز است(هدف)، "| glibc:"، سه‌گانه هدف.گلیبسی است(هدف)
        اگر آرایش.طول() == ۰:
            سرچاپ "  آرایش داده‌ی آماده ندارد؛ انتخاب با LLVM"
        پایان
    پایان
پایان
خروجیx86_64-pc-windows-msvc اشاره‌گر: 64 بیتی، کوچک‌پایان ویندوز: true | glibc: false aarch64-apple-darwin اشاره‌گر: 64 بیتی، کوچک‌پایان ویندوز: false | glibc: false riscv64-unknown-linux-gnu اشاره‌گر: 64 بیتی، کوچک‌پایان ویندوز: false | glibc: true armeb-unknown-linux-gnueabi اشاره‌گر: 32 بیتی، بزرگ‌پایان ویندوز: false | glibc: true wasm32-unknown-wasi اشاره‌گر: 32 بیتی، نامعلوم ویندوز: false | glibc: false آرایش داده‌ی آماده ندارد؛ انتخاب با LLVM aarch64-linux-android اشاره‌گر: 64 بیتی، کوچک‌پایان ویندوز: false | glibc: true

دو پاسخ نگاه دوباره می‌خواهند. وب‌اسمبلی آرایش آماده ندارد، پس ترتیب بایتش این‌جا نامعلوم است، با این که وب‌اسمبلی کوچک‌پایان است. اندروید glibc: true گزارش می‌کند؛ ابزار ساختی که برنامه‌ی اندروید می‌سازد باید پیش از اعتماد به گلیبسی است خودش دنبال android بگردد.

تابع‌ها

آرایش داده میزبان HostDatalayout

تابع آرایش داده میزبان(): رشته
آرایش داده‌ی ماشین میزبان.
llvm-triple-Layout.salam
واردسازی ال ال وی ام.سه‌گانه هدف

تابع ریشه:
    هر هدف در ["x86_64-unknown-linux-gnu"، "aarch64-unknown-linux-musl"، "aarch64-apple-darwin"، "x86_64-pc-windows-msvc"، "i686-w64-windows-gnu"، "wasm32-unknown-wasi"]:
        سرچاپ هدف، سه‌گانه هدف.بیت‌های اشاره‌گر(هدف)، سه‌گانه هدف.ویندوز است(هدف)، سه‌گانه هدف.گلیبسی است(هدف)
        آ := سه‌گانه هدف.آرایش داده(هدف)
        اگر آ.طول() > ۰:
            سرچاپ "  "، آ
        وگرنه:
            سرچاپ "  ناشناخته؛ LLVM خودش تعیین می‌کند"
        پایان
    پایان
    سرچاپ سه‌گانه هدف.آرایش داده میزبان().طول() > ۰
پایان
خروجیx86_64-unknown-linux-gnu 64 false true e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128 aarch64-unknown-linux-musl 64 false false e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128 aarch64-apple-darwin 64 false false e-m:o-i64:64-i128:128-n32:64-S128 x86_64-pc-windows-msvc 64 true false e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128 i686-w64-windows-gnu 32 true false ناشناخته؛ LLVM خودش تعیین می‌کند wasm32-unknown-wasi 32 false false ناشناخته؛ LLVM خودش تعیین می‌کند true

آرایش داده Datalayout

تابع آرایش داده(t: رشته): رشته
رشته‌ی آرایش داده‌ی LLVM برای سه‌تایی: ترتیب بایت‌ها، اندازه‌ی اشاره‌گر و هم‌ترازی نوع‌ها؛ برای هدفی که نمی‌شناسد، مثل وب‌اسمبلی، خالی. سه‌تایی خالی آرایش میزبان را می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam

بیت‌های اشاره‌گر PointerBits

تابع بیت‌های اشاره‌گر(t: رشته): صحیح
اندازه‌ی اشاره‌گر هدف بر حسب بیت: ۶۴، ۳۲، یا ۱۶ برای AVR و MSP430. سه‌تایی خالی یا ناشناخته اندازه‌ی میزبان را می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam

ویندوز است IsWindows

تابع ویندوز است(t: رشته): منطقی
سه‌تایی از ویندوز، MinGW یا Win32 نام می‌برد؛ سه‌تایی خالی درباره‌ی میزبان می‌پرسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam

گلیبسی است IsGlibc

تابع گلیبسی است(t: رشته): منطقی
هدف لینوکس است و musl، مک، ویندوز یا وب‌اسمبلی نیست. سه‌تایی‌های اندروید هم glibc به حساب می‌آیند. برای سه‌تایی خالی نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam