سهگانه هدف 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 هر فیلد را هماندازهی خودش همتراز میکند.
واردسازی ال ال وی ام.سهگانه هدف
تابع گرد به بالا(عدد: صحیح، همترازی: صحیح): صحیح:
برگشت (عدد + همترازی - ۱) / همترازی * همترازی
پایان
تابع اندازه گره(هدف: رشته): صحیح:
اشارهگر := سهگانه هدف.بیتهای اشارهگر(هدف) / ۸
ناپایا اندازه := اشارهگر
اندازه = گرد به بالا(اندازه، ۴) + ۴
اندازه = گرد به بالا(اندازه، اشارهگر) + اشارهگر
برگشت گرد به بالا(اندازه، اشارهگر)
پایان
تابع ریشه:
هر هدف در ["x86_64-unknown-linux-gnu"، "i686-unknown-linux-gnu"، "wasm32-unknown-wasi"، "aarch64-apple-darwin"]:
سرچاپ هدف، "اشارهگر"، سهگانه هدف.بیتهای اشارهگر(هدف)، "بیتی، گره"، اندازه گره(هدف)، "بایت"
پایان
پایانگره روی هدفهای ۶۴ بیتی دو برابر است: دو اشارهگر هشت بایتی و یک عدد چهار بایتی که تا هشت پر میشود. روی هدف ۳۲ بیتی، از جمله وباسمبلی، هر فیلد چهار بایت است و پرکردنی در کار نیست. برای پاسخ دقیق دربارهی هر گونه، رشتهی آرایش داده را به LLVM بدهید، همان کاری که بستهی ال ال وی ام میکند.
انتخاب نام فایل و کتابخانهی C
ابزار ساخت چند تصمیم را مستقیم از روی سهتایی میگیرد: برنامههای ویندوز با .exe تمام میشوند، برنامهی glibc هر جا اجرا شود glibc سازگار لازم دارد، و برنامهی musl را میشود کاملا ایستا پیوند داد و روی هر لینوکسی کپی کرد. ویندوز است و گلیبسی است دو پرسش اول را پاسخ میدهند؛ بقیه را میشود با رشته از خود سهتایی خواند.
واردسازی ال ال وی ام.سهگانه هدف
واردسازی رشته
تابع نام خروجی(نام: رشته، هدف: رشته): رشته:
اگر سهگانه هدف.ویندوز است(هدف):
برگشت نام + ".exe"
پایان
برگشت نام
پایان
تابع یادداشت کتابخانه(هدف: رشته): رشته:
اگر سهگانه هدف.ویندوز است(هدف):
برگشت "با کتابخانهی C ویندوز پیوند میخورد"
وگرنه سهگانه هدف.گلیبسی است(هدف):
برگشت "روی ماشین مقصد glibc لازم دارد"
وگرنه رشته.شامل است(هدف، "musl"):
برگشت "میتواند کاملا ایستا باشد"
پایان
برگشت "از کتابخانهی C سیستم استفاده میکند"
پایان
تابع ریشه:
هر هدف در ["x86_64-unknown-linux-gnu"، "x86_64-linux-musl"، "x86_64-w64-windows-gnu"، "aarch64-apple-darwin"]:
سرچاپ نام خروجی("app"، هدف)، "برای"، هدف
سرچاپ " " + یادداشت کتابخانه(هدف)
پایان
پایانوقتی آرایش داده رشتهی خالی برمیگرداند، هدف برای این بسته ناشناخته است. این خطا نیست: آرایش داده را در ماژول نگذارید تا LLVM پیشفرض خودش را برای آن سهتایی بگذارد.
بسته دربارهی یک هدف چه میداند
این برنامه از همهی تابعها دربارهی شش هدف میپرسد. نخستین حرف رشتهی آرایش داده ترتیب بایت است: e برای کوچکپایان و E برای بزرگپایان. بقیهی رشته، به قالب خود LLVM، اندازه و همترازی اشارهگرها و گونههای عددی را میگوید.
واردسازی ال ال وی ام.سهگانه هدف
واردسازی رشته
تابع ترتیب بایت(آرایش: رشته): رشته:
اگر آرایش.طول() == ۰:
برگشت "نامعلوم"
پایان
اگر رشته.شروع با(آرایش، "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"
پایان
پایان
پایاندو پاسخ نگاه دوباره میخواهند. وباسمبلی آرایش آماده ندارد، پس ترتیب بایتش اینجا نامعلوم است، با این که وباسمبلی کوچکپایان است. اندروید glibc: true گزارش میکند؛ ابزار ساختی که برنامهی اندروید میسازد باید پیش از اعتماد به گلیبسی است خودش دنبال android بگردد.
تابعها
آرایش داده میزبان HostDatalayout
تابع آرایش داده میزبان(): رشتهواردسازی ال ال وی ام.سهگانه هدف
تابع ریشه:
هر هدف در ["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 خودش تعیین میکند"
پایان
پایان
سرچاپ سهگانه هدف.آرایش داده میزبان().طول() > ۰
پایانآرایش داده Datalayout
تابع آرایش داده(t: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam
بیتهای اشارهگر PointerBits
تابع بیتهای اشارهگر(t: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam
ویندوز است IsWindows
تابع ویندوز است(t: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam
گلیبسی است IsGlibc
تابع گلیبسی است(t: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: llvm-triple-Layout.salam