พื้นที่เก็บข้อมูลนี้มีสคริปต์การสร้างและวัสดุเสริมสำหรับการสร้าง toolchain ที่ใช้ LLVM แบบ Bare-metal โดยกำหนดเป้าหมายไปที่ Arm ตาม:
เป้าหมายคือการจัดหาชุดเครื่องมือโลหะเปลือยที่ใช้ LLVM ซึ่งสามารถกำหนดเป้าหมายตระกูลสถาปัตยกรรม Arm จาก Armv6-M และใหม่กว่า ห่วงโซ่เครื่องมือเป็นไปตาม ABI สำหรับสถาปัตยกรรม Arm และพยายามที่จะจัดเตรียมคุณสมบัติทั่วไปที่จำเป็นสำหรับระบบปฏิบัติการแบบฝังและเรียลไทม์
รองรับ C++ บางส่วนด้วยการใช้ libc++ และ libc++abi จาก LLVM คุณสมบัติที่ไม่รองรับได้แก่:
LLVM Embedded Toolchain for Arm ใช้เวอร์ชัน libc++ ABI ที่ไม่เสถียร ABI นี้ใช้การปรับปรุงและแก้ไขข้อบกพร่องของ libc++ ล่าสุดทั้งหมด แต่อาจส่งผลให้เกิดข้อผิดพลาดในลิงก์เมื่อทำการลิงก์กับอ็อบเจ็กต์ที่คอมไพล์กับ ABI เวอร์ชันเก่า สำหรับข้อมูลเพิ่มเติม โปรดดู https://libcxx.llvm.org/DesignDocs/ABIVersioning.html
LLVM Embedded Toolchain for Arm อาศัยส่วนประกอบอัปสตรีมต่อไปนี้
ส่วนประกอบ | ลิงค์ |
---|---|
LLVM | https://github.com/llvm/llvm-project |
พิโคลิบซี | https://github.com/picolibc/picolibc |
เนื้อหาของพื้นที่เก็บข้อมูลนี้ได้รับอนุญาตภายใต้ Apache-2.0 ดู LICENSE.txt
ไบนารีที่ได้ผลลัพธ์จะอยู่ภายใต้ใบอนุญาตโอเพ่นซอร์สที่เกี่ยวข้อง ดูลิงก์ส่วนประกอบด้านบน
การทดสอบสำหรับบางเป้าหมายใช้โมเดล Arm FVP ที่เปิดให้ใช้งานฟรีแต่ไม่ใช่โอเพ่นซอร์ส ซึ่งมีลิขสิทธิ์ของตัวเอง สิ่งเหล่านี้ไม่ได้ใช้ตามค่าเริ่มต้น โปรดดูรายละเอียดการสร้างจากแหล่งที่มา
LLVM Embedded Toolchain for Arm สร้างและทดสอบบน Ubuntu 18.04 LTS
เวอร์ชัน Windows สร้างขึ้นบน Windows Server 2019 และทดสอบเล็กน้อยบน Windows 10
การสร้างบน macOS นั้นใช้งานได้กับ x86_64 และ Apple Silicon
แพ็คเกจไบนารี่มีไว้สำหรับ LLVM รุ่นหลักสำหรับ Linux และ Windows
ดาวน์โหลด toolchain รุ่นต่างๆ สำหรับแพลตฟอร์มของคุณจากรุ่น Github และแยกไฟล์เก็บถาวรลงในไดเร็กทอรีที่กำหนดเอง
ติดตั้งแพ็คเกจ Microsoft Visual C++ Redistributable ล่าสุดที่รองรับ เช่น จากการดาวน์โหลดล่าสุดที่รองรับ Microsoft Visual C++ Redistributable
หมายเหตุ: หากคุณกำลังใช้ toolchain ในสภาพแวดล้อมที่ใช้ร่วมกันโดยมีอินพุตที่ไม่น่าเชื่อถือ ตรวจสอบให้แน่ใจว่ามีแซนด์บ็อกซ์เพียงพอ
หากต้องการใช้ toolchain คุณต้องระบุตัวเลือกต่อไปนี้บนบรรทัดคำสั่ง:
crt0
หรือ crt0-semihost
crt0
จะถูกเชื่อมโยงโดยอัตโนมัติ แต่สามารถระงับได้ด้วยตัวเลือก -nostartfiles
เพื่อให้ crt0-semihost
สามารถใช้งานได้crt0-semihost
-T
สคริปต์ picolibcpp.ld
และ picolibc.ld
เริ่มต้นมีให้และสามารถใช้ได้โดยตรงหรือรวมจากสคริปต์ตัวเชื่อมโยงที่กำหนดเองตัวอย่างเช่น:
$ PATH=/LLVMEmbeddedToolchainForArm-/bin:$PATH
$ clang
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
ระบบ multilib ของ clang
จะเลือกชุดไลบรารีที่เหมาะสมโดยอัตโนมัติตามแฟล็กการคอมไพล์ของคุณ clang
จะส่งเสียงเตือนหากไม่พบชุดไลบรารีที่เหมาะสม
หากต้องการแสดงไดเร็กทอรีที่เลือกโดยระบบ multilib ให้เพิ่มแฟล็ก -print-multi-directory
ลงในตัวเลือกบรรทัดคำสั่ง clang
ของคุณ
หากต้องการแสดง multilibs ที่มีอยู่ทั้งหมด ให้รัน clang
ด้วย flag -print-multi-lib
และ target triple เช่น --target=aarch64-none-elf
หรือ --target=arm-none-eabi
เป็นไปได้ว่า clang
จะเลือกชุดของไลบรารี่ที่ไม่ใช่ไลบรารีที่คุณต้องการใช้ ในกรณีนี้ คุณสามารถข้ามระบบ multilib ได้โดยจัดเตรียมตัวเลือก --sysroot
ที่ระบุไดเร็กทอรีที่มีไดเร็กทอรี include
และ lib
ของไลบรารีที่คุณต้องการใช้ ตัวอย่างเช่น:
$ clang
--sysroot=/LLVMEmbeddedToolchainForArm-/lib/clang-runtimes/arm-none-eabi/armv6m_soft_nofp
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
สามารถข้ามการเลือก FPU ได้ แต่ไม่แนะนำ เนื่องจากค่าเริ่มต้นจะแตกต่างจาก GCC
บิลด์ของ toolchain มาพร้อมกับไฟล์กำหนดค่าสองไฟล์ ได้แก่ Omax.cfg และ OmaxLTO.cfg เมื่อใช้ ไฟล์กำหนดค่าเหล่านี้จะเปิดใช้แฟล็กการปรับบิลด์หลายรายการเพื่อให้ได้ประสิทธิภาพสูงสุดบนการวัดประสิทธิภาพแบบฝังทั่วไป OmaxLTO.cfg เปิดใช้งานแฟล็กเฉพาะการเพิ่มประสิทธิภาพเวลาลิงก์ (LTO) การกำหนดค่าเหล่านี้สามารถเลือกส่งผ่านได้โดยใช้แฟล็ก --config
ตัวอย่างเช่น:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
ผู้ใช้ควรได้รับการเตือนว่า Omax.cfg เปิดใช้งาน -ffast-math
ซึ่งทำลายการปฏิบัติตามข้อกำหนดของ IEEE และเปิดใช้งานการเพิ่มประสิทธิภาพทางคณิตศาสตร์ซึ่งอาจส่งผลต่อความถูกต้องของโค้ด LTO จะถูกเก็บไว้แยกกันใน OmaxLTO.cfg เนื่องจากผู้ใช้อาจไม่ต้องการ LTO เนื่องจากอาจเพิ่มเวลาในการลิงก์และ/หรือการใช้หน่วยความจำเพิ่มขึ้นระหว่างการลิงก์ ตัวเลือกบางตัวในไฟล์กำหนดค่าเป็นตัวเลือก LLVM ภายในที่ไม่มีเอกสาร สำหรับตัวเลือกที่ไม่มีเอกสารเหล่านี้ โปรดดูซอร์สโค้ดของการเพิ่มประสิทธิภาพที่เกี่ยวข้องในโครงการ LLVM เพื่อดูข้อมูลเพิ่มเติม ผู้ใช้ยังได้รับการสนับสนุนให้สร้างการกำหนดค่าของตนเองและปรับแต่งพารามิเตอร์แฟล็กของตนเอง ข้อมูลเกี่ยวกับ LLVM Embedded Toolchain สำหรับการตั้งค่าสถานะการปรับให้เหมาะสมเฉพาะของ Arm มีอยู่ในการตั้งค่าสถานะการปรับให้เหมาะสม
การเผยแพร่ไบนารีของ LLVM Embedded Toolchain for Arm นั้นขึ้นอยู่กับสาขาการเผยแพร่ของโครงการ LLVM อัปสตรีม ดังนั้นจึงสามารถใช้งานได้อย่างปลอดภัยกับเครื่องมือทั้งหมดที่จัดทำโดย LLVM เวอร์ชันที่ตรงกัน
โปรดดูการย้ายจาก Arm GNU Toolchain และการสนับสนุน Newlib แบบทดลอง สำหรับคำแนะนำในการใช้ LLVM Embedded Toolchain สำหรับ Arm กับโปรเจ็กต์ที่มีอยู่ซึ่งอาศัย Arm GNU Toolchain
หมายเหตุ:
picolibc
ให้การสนับสนุน Arm GNU Toolchain เป็นอย่างดี ดังนั้นโปรเจ็กต์ที่ต้องใช้ทั้ง Arm GNU Toolchain และ LLVM Embedded Toolchain สำหรับ Arm จึงสามารถเลือกpicolibc
หรือnewlib
ได้
LLVM Embedded Toolchain for Arm เป็นโปรเจ็กต์โอเพนซอร์สและสามารถสร้างจากซอร์สได้ โปรดดูคู่มือการสร้างจากแหล่งที่มาสำหรับคำแนะนำโดยละเอียด
โปรดแจ้งปัญหาผ่านปัญหา Github
โปรดดูคู่มือการบริจาคสำหรับรายละเอียด