clang: จะแสดงรายการสถาปัตยกรรมเป้าหมายที่รองรับได้อย่างไร?


98

ตอนนี้ฉันสนใจ ARM โดยทั่วไปและเฉพาะเป้าหมาย iphone / android แต่ฉันแค่อยากรู้เพิ่มเติมเกี่ยวกับเสียงดังเพราะรู้สึกว่ามีบทบาทสำคัญในอีกหลายปีข้างหน้า

ฉันเหนื่อย

clang -cc1 --help|grep -i list
clang -cc1 --help|grep arch|grep -v search
clang -cc1 --help|grep target

 -triple <value>         Specify target triple (e.g. i686-apple-darwin9)

ฉันรู้ว่า clang มีพารามิเตอร์ -triplet แต่ฉันจะแสดงรายการค่าที่เป็นไปได้ทั้งหมดได้อย่างไร ฉันพบว่าเสียงดังกราวแตกต่างจาก gcc มากในแง่ของการรวบรวมข้ามในโลก GCC คุณควรมีไบนารีแยกต่างหากสำหรับทุกสิ่งเช่น PLATFORM_make หรือ PLATFORM_ld (i * 86-pc-cygwin i * 86 - * - linux-gnu เป็นต้นhttp : //git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )

ในโลกเสียงดังมันเป็นเพียงไบนารีเดียว (ตามที่ฉันอ่านในบางฟอรัม) แต่ฉันจะรับรายชื่อเป้าหมายที่รองรับได้อย่างไร และหากเป้าหมายของฉันไม่รองรับบน distro ของฉัน (linux / windows / macos / อะไรก็ตาม) ฉันจะหาเป้าหมายที่รองรับแพลตฟอร์มเพิ่มเติมได้อย่างไร

ถ้าฉัน SVN ส่งเสียงดังล่าสุดเช่นนี้:

svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

ฉันจะได้รับแพลตฟอร์มส่วนใหญ่หรือไม่ ดูเหมือนว่า Clang ไม่ได้ถูกสร้างขึ้นโดยคำนึงถึงการรวบรวมข้ามในทันที แต่เนื่องจากมันมีพื้นฐานมาจาก llvm มันควรจะเป็นมิตรต่อกันในทางทฤษฎี ขอบคุณ!


8
ไม่ใช่คำตอบที่สมบูรณ์ แต่ LLC
เวอร์ชัน

1
ฉันคิดว่าคุณจะต้องดูที่มาเพื่อดูสามเท่า และตามที่ฉันเข้าใจแล้วการสร้างเสียงดังเริ่มต้นจะรวมการสนับสนุนพื้นฐานสำหรับการคอมไพล์ข้าม การสนับสนุนขั้นพื้นฐานจะเปลี่ยนโค้ดเป็นไฟล์ออบเจ็กต์เท่านั้น (ตราบใดที่แอสเซมเบลอร์ในตัวรองรับทริปเปิลมิฉะนั้นคุณจะต้องใช้ไฟล์. s) คุณจะต้องจัดหาส่วนหัวไลบรารีตัวเชื่อมโยง (จนกว่า lld จะใช้งานได้) ฯลฯ
bames53

1
แม้ว่าการติดตั้งเริ่มต้นจะมีเพียงไฟล์ปฏิบัติการ clang และ clang ++ เช่นเดียวกับแพลตฟอร์มอื่น ๆ คุณสามารถสร้างสำเนาหรือฮาร์ดลิงก์ของพวกเขาด้วยสามเท่าและสี่คนที่เข้ารหัสในชื่อ clang ++ และ clang เป็นเพียงสำเนาของกันและกันซึ่งจะตรวจสอบชื่อของไฟล์ปฏิบัติการเพื่อดูวิธีประมวลผลอินพุต
ปอนด์

1
ที่เกี่ยวข้อง - Clang สนับสนุนเป้าหมายใด .
Royi

คำตอบ:


57

เท่าที่ฉันสามารถบอกได้ไม่มีตัวเลือกบรรทัดคำสั่งในการระบุว่าสถาปัตยกรรมใดที่clangรองรับไบนารีที่กำหนดและแม้แต่การทำงานstringsบนมันก็ไม่ได้ช่วยอะไรเลย เสียงดังเป็นเพียงตัวแปลภาษา C ถึง LLVM และเป็น LLVM เองที่เกี่ยวข้องกับความสำคัญของการสร้างรหัสเครื่องจริงดังนั้นจึงไม่น่าแปลกใจเลยที่ Clang ไม่ได้ให้ความสนใจกับสถาปัตยกรรมพื้นฐานมากนัก

ดังที่คนอื่น ๆ ได้กล่าวไว้แล้วคุณสามารถถามllcว่าสถาปัตยกรรมใดรองรับ ทั้งหมดนี้ไม่ได้มีประโยชน์เพียงเพราะส่วนประกอบ LLVM เหล่านี้อาจไม่ได้รับการติดตั้ง แต่เนื่องจากความหลากหลายของเส้นทางการค้นหาและระบบบรรจุภัณฑ์ไบนารีของคุณllcและclangอาจไม่สอดคล้องกับ LLVM เวอร์ชันเดียวกัน

อย่างไรก็ตามเพื่อประโยชน์ในการโต้แย้งสมมติว่าคุณรวบรวมทั้ง LLVM และ Clang ด้วยตัวเองหรือคุณยินดีที่จะยอมรับไบนารี LLVM ของคุณดีพอ:

  • llc --versionจะให้รายชื่อสถาปัตยกรรมทั้งหมดที่รองรับ โดยค่าเริ่มต้นคอมไพล์เพื่อรองรับสถาปัตยกรรมทั้งหมด สิ่งที่คุณอาจคิดว่าเป็นสถาปัตยกรรมเดียวเช่น ARM อาจมีสถาปัตยกรรม LLVM หลายแบบเช่น ARM ปกติ Thumb และ AArch64 ส่วนใหญ่เพื่อความสะดวกในการใช้งานเนื่องจากโหมดการดำเนินการที่แตกต่างกันมีการเข้ารหัสคำสั่งและความหมายที่แตกต่างกันมาก
  • สำหรับสถาปัตยกรรมแต่ละรายการที่ระบุไว้ llc -march=ARCH -mattr=helpจะแสดงรายการ "CPU ที่พร้อมใช้งาน" และ "คุณลักษณะที่มี" โดยทั่วไปแล้วซีพียูเป็นเพียงวิธีที่สะดวกในการตั้งค่าชุดคุณสมบัติเริ่มต้น

แต่ตอนนี้สำหรับข่าวร้าย ไม่มีตารางสามเท่าที่สะดวกใน Clang หรือ LLVM ที่สามารถทิ้งได้เนื่องจากแบ็กเอนด์เฉพาะสถาปัตยกรรมมีตัวเลือกในการแยกวิเคราะห์สตริงสามตัวลงในllvm::Tripleวัตถุ (กำหนดในinclude / llvm / ADT / Triple.h ) กล่าวอีกนัยหนึ่งในการถ่ายโอนข้อมูลสามเท่าที่มีอยู่ทั้งหมดจำเป็นต้องแก้ไขปัญหาการหยุดชะงัก ดูตัวอย่างเช่นllvm::ARM_MC::ParseARMTriple(...)"generic"ที่พิเศษกรณีแยกสตริง

ท้ายที่สุดแล้ว "สามเท่า" ส่วนใหญ่เป็นคุณสมบัติที่เข้ากันได้แบบย้อนกลับเพื่อให้ Clang เป็นตัวแทนที่ GCC แบบดรอปอินดังนั้นโดยทั่วไปคุณไม่จำเป็นต้องให้ความสนใจมากนักเว้นแต่คุณจะย้าย Clang หรือ LLVM ไปยังแพลตฟอร์มใหม่ หรือสถาปัตยกรรม แต่คุณอาจพบผลลัพธ์ของllc -march=arm -mattr=helpคุณสมบัติ ARM ที่แตกต่างกันมากมายเพื่อเป็นประโยชน์ในการสืบสวนของคุณ

ขอให้โชคดีกับการค้นคว้าของคุณ!


35

ฉันใช้ Clang 3.3 ฉันคิดว่าวิธีที่ดีที่สุดในการรับคำตอบคือการอ่านซอร์สโค้ด ใน llvm / ADT / Triple.h ( http://llvm.org/doxygen/Triple_8h_source.html ):

  enum ArchType {
    UnknownArch,

    arm,     // ARM: arm, armv.*, xscale
    aarch64, // AArch64: aarch64
    hexagon, // Hexagon: hexagon
    mips,    // MIPS: mips, mipsallegrex
    mipsel,  // MIPSEL: mipsel, mipsallegrexel
    mips64,  // MIPS64: mips64
    mips64el,// MIPS64EL: mips64el
    msp430,  // MSP430: msp430
    ppc,     // PPC: powerpc
    ppc64,   // PPC64: powerpc64, ppu
    r600,    // R600: AMD GPUs HD2XXX - HD6XXX
    sparc,   // Sparc: sparc
    sparcv9, // Sparcv9: Sparcv9
    systemz, // SystemZ: s390x
    tce,     // TCE (http://tce.cs.tut.fi/): tce
    thumb,   // Thumb: thumb, thumbv.*
    x86,     // X86: i[3-9]86
    x86_64,  // X86-64: amd64, x86_64
    xcore,   // XCore: xcore
    mblaze,  // MBlaze: mblaze
    nvptx,   // NVPTX: 32-bit
    nvptx64, // NVPTX: 64-bit
    le32,    // le32: generic little-endian 32-bit CPU (PNaCl / Emscripten)
    amdil,   // amdil: amd IL
    spir,    // SPIR: standard portable IR for OpenCL 32-bit version
    spir64   // SPIR: standard portable IR for OpenCL 64-bit version
  };

และใน clang / lib / Driver / ToolChains.cpp มี sth เกี่ยวกับแขน

static const char *GetArmArchForMArch(StringRef Value) {
  return llvm::StringSwitch<const char*>(Value)
    .Case("armv6k", "armv6")
    .Case("armv6m", "armv6m")
    .Case("armv5tej", "armv5")
    .Case("xscale", "xscale")
    .Case("armv4t", "armv4t")
    .Case("armv7", "armv7")
    .Cases("armv7a", "armv7-a", "armv7")
    .Cases("armv7r", "armv7-r", "armv7")
    .Cases("armv7em", "armv7e-m", "armv7em")
    .Cases("armv7f", "armv7-f", "armv7f")
    .Cases("armv7k", "armv7-k", "armv7k")
    .Cases("armv7m", "armv7-m", "armv7m")
    .Cases("armv7s", "armv7-s", "armv7s")
    .Default(0);
}

static const char *GetArmArchForMCpu(StringRef Value) {
  return llvm::StringSwitch<const char *>(Value)
    .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
    .Cases("arm10e", "arm10tdmi", "armv5")
    .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
    .Case("xscale", "xscale")
    .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6")
    .Case("cortex-m0", "armv6m")
    .Cases("cortex-a8", "cortex-r4", "cortex-a9", "cortex-a15", "armv7")
    .Case("cortex-a9-mp", "armv7f")
    .Case("cortex-m3", "armv7m")
    .Case("cortex-m4", "armv7em")
    .Case("swift", "armv7s")
    .Default(0);
}

5
แล้วส่วนที่สองและสามของ Triple ล่ะ?
osgx

และตัวแยกวิเคราะห์จริงของชื่อ Arch ลงใน ArchType อยู่ในcode.metager.de/source/xref/llvm/llvm/lib/Support/… - ฟังก์ชัน llvm / lib / Support / Triple.cpp static Triple::ArchType parseArch(StringRef ArchName)
osgx

การมีไบนารีเสียงดังไม่ได้หมายความว่าผู้ใช้รวบรวมจากแหล่งที่มา
Colin LeMahieu

คำอธิบายบางส่วนของเป้าหมายและสามเท่าของClang : llvm.org/devmtg/2014-04/PDFs/LightningTalks/…เสนอในปี 2014: "Target Triple: <arch> <sub> - <vendor> - <sys> - <abi> ; --print-supported-archs --print-supported- supplier --print
osgx

20

คำใบ้อย่างหนึ่งที่คุณสามารถทำได้: หากคุณกำลังพยายามค้นหาเป้าหมายที่ต้องการสามเป้าหมายคือการติดตั้ง llvm ในระบบนั้นจากนั้นทำ

$ llc --version | grep Default
  Default target: x86_64-apple-darwin16.1.0

หรืออีกทางหนึ่ง:

$ llvm-config --host-target
x86_64-apple-darwin16.0.0
or
$ clang -v 2>&1 | grep Target
Target: x86_64-apple-darwin16.1.0

แล้วคุณจะรู้วิธีกำหนดเป้าหมายเมื่อมีการคอมไพล์ข้าม

เห็นได้ชัดว่ามีเป้าหมาย "จำนวนมาก" อยู่ที่นั่นนี่คือรายการอย่าลังเลที่จะเพิ่มเข้าไปในสไตล์วิกิชุมชน:

arm-none-eabi
armv7a-none-eabi
arm-linux-gnueabihf 
arm-none-linux-gnueabi
i386-pc-linux-gnu 
x86_64-apple-darwin10
i686-w64-windows-gnu # same as i686-w64-mingw32
x86_64-pc-linux-gnu # from ubuntu 64 bit
x86_64-unknown-windows-cygnus # cygwin 64-bit
x86_64-w64-windows-gnu # same as x86_64-w64-mingw32
i686-pc-windows-gnu # MSVC
x86_64-pc-windows-gnu # MSVC 64-BIT

นี่คือรายการเอกสาร (ดูเหมือนว่าจะเป็นสี่เท่า [หรือ quintuple?] แทนที่จะเป็นสามเท่าในปัจจุบัน):

The triple has the general format <arch><sub>-<vendor>-<sys>-<abi>, where:
arch = x86, arm, thumb, mips, etc.
sub = for ex. on ARM: v5, v6m, v7a, v7m, etc.
vendor = pc, apple, nvidia, ibm, etc.
sys = none, linux, win32, darwin, cuda, etc.
abi = eabi, gnu, android, macho, elf, etc.

และคุณยังสามารถปรับแต่งระบุซีพียูเป้าหมายที่นอกเหนือจากนี้ได้แม้ว่าจะใช้ค่าเริ่มต้นที่เหมาะสมสำหรับซีพียูเป้าหมายตามสามเท่าก็ตาม

บางครั้งก็กำหนดเป้าหมาย "แก้ไข" ไปที่สิ่งเดียวกันดังนั้นเพื่อดูว่าเป้าหมายได้รับการปฏิบัติอย่างไร:

 $ clang -target x86_64-w64-mingw32 -v 2>&1 | grep Target
 Target: x86_64-w64-windows-gnu

เมื่อมีการกล่าวmingw32ว่ามันจะใช้ไม่ได้กับ MinGW64? มีบางอย่างที่เข้ากันได้กับ MSVC หรือไม่?
Royi

@Royi stackoverflow.com/q/39871656/32453อาจเป็นประโยชน์โชคดี!
rogerdpack

13

ตามที่โจนาธานโรเอลอฟส์พูดในคำพูดนี้“ แคลงสนับสนุนเป้าหมายใดบ้าง” :

$ llc --version
LLVM (http://llvm.org/):
  LLVM version 3.6.0
  Optimized build with assertions.
  Built Apr  2 2015 (01:25:22).
  Default target: x86_64-apple-darwin12.6.0
  Host CPU: corei7-avx

  Registered Targets:
    aarch64    - AArch64 (little endian)
    aarch64_be - AArch64 (big endian)
    amdgcn     - AMD GCN GPUs
    arm        - ARM
    arm64      - ARM64 (little endian)
    armeb      - ARM (big endian)
    cpp        - C++ backend
    hexagon    - Hexagon
    mips       - Mips
    mips64     - Mips64 [experimental]
    mips64el   - Mips64el [experimental]
    mipsel     - Mipsel
    msp430     - MSP430 [experimental]
    nvptx      - NVIDIA PTX 32-bit
    nvptx64    - NVIDIA PTX 64-bit
    ppc32      - PowerPC 32
    ppc64      - PowerPC 64
    ppc64le    - PowerPC 64 LE
    r600       - AMD GPUs HD2XXX-HD6XXX
    sparc      - Sparc
    sparcv9    - Sparc V9
    systemz    - SystemZ
    thumb      - Thumb
    thumbeb    - Thumb (big endian)
    x86        - 32-bit X86: Pentium-Pro and above
    x86-64     - 64-bit X86: EM64T and AMD64
    xcore      - XCore

Clang เวอร์ชันในอนาคตอาจมีดังต่อไปนี้ มีการระบุว่า "เสนอ" แม้ว่าจะยังไม่พร้อมใช้งานอย่างน้อยในเวอร์ชัน 3.9.0:

$ clang -target <target_from_list_above> --print-multi-libs
$ clang -print-supported-archs
$ clang -march x86 -print-supported-systems 
$ clang -march x86 -print-available-systems 

ดูเหมือนว่าจะใช้ไม่ได้กับ Clang เวอร์ชันที่ใหม่กว่า
Royi

6

ลองดูด้วย

> llc -mattr=help

Available CPUs for this target:

  amdfam10      - Select the amdfam10 processor.
  athlon        - Select the athlon processor.
  athlon-4      - Select the athlon-4 processor.
  athlon-fx     - Select the athlon-fx processor.
  athlon-mp     - Select the athlon-mp processor.
  athlon-tbird  - Select the athlon-tbird processor.
  athlon-xp     - Select the athlon-xp processor.
  athlon64      - Select the athlon64 processor.
  athlon64-sse3 - Select the athlon64-sse3 processor.
  atom          - Select the atom processor.
  ...
Available features for this target:

  16bit-mode           - 16-bit mode (i8086).
  32bit-mode           - 32-bit mode (80386).
  3dnow                - Enable 3DNow! instructions.
  3dnowa               - Enable 3DNow! Athlon instructions.
  64bit                - Support 64-bit instructions.
  64bit-mode           - 64-bit mode (x86_64).
  adx                  - Support ADX instructions.
  ...

6
เสียงดังที่พร้อมใช้งานไม่ได้หมายความว่ามี LLC
Colin LeMahieu

1
ดูเหมือนว่า llc มักจะติดตั้งพร้อมกับเสียงดัง แต่ ... และคุณสามารถติดตั้งได้หากไม่ได้มาจากตัวจัดการแพ็คเกจของคุณและมันควรจะเรียงกันฉันเดา ... อย่างไรก็ตามรายการนี้ดูเหมือนจะเป็นถ้าคุณต้องการกำหนดเป้าหมาย cpu ที่เฉพาะเจาะจงไม่จำเป็นต้องเป็นสถาปัตยกรรม "สามเท่า" ที่แตกต่างกันอย่างที่ OP ต้องการ ...
rogerdpack

5
หากต้องการแสดงรายการตัวเลือกสำหรับสถาปัตยกรรมอื่น ๆ คุณสามารถใช้-mtripleตัวเลือกดังllc -mtriple=arm -mattr=helpกล่าวได้
Lekensteyn

4

เริ่มต้น Clang 11 (ลำตัว) รายการของสถาปัตยกรรมเป้าหมายที่รองรับสามารถพิมพ์ได้อย่างสะดวกโดยใช้-print-targetsแฟล็กที่เพิ่มใหม่:

$ clang-11 -print-targets
  Registered Targets:
    aarch64    - AArch64 (little endian)
    aarch64_32 - AArch64 (little endian ILP32)
    aarch64_be - AArch64 (big endian)
    amdgcn     - AMD GCN GPUs
    arm        - ARM
    arm64      - ARM64 (little endian)
    arm64_32   - ARM64 (little endian ILP32)
    armeb      - ARM (big endian)
    avr        - Atmel AVR Microcontroller
    bpf        - BPF (host endian)
    bpfeb      - BPF (big endian)
    bpfel      - BPF (little endian)
    hexagon    - Hexagon
    lanai      - Lanai
    mips       - MIPS (32-bit big endian)
    mips64     - MIPS (64-bit big endian)
    mips64el   - MIPS (64-bit little endian)
    mipsel     - MIPS (32-bit little endian)
    msp430     - MSP430 [experimental]
    nvptx      - NVIDIA PTX 32-bit
    nvptx64    - NVIDIA PTX 64-bit
    ppc32      - PowerPC 32
    ppc64      - PowerPC 64
    ppc64le    - PowerPC 64 LE
    r600       - AMD GPUs HD2XXX-HD6XXX
    riscv32    - 32-bit RISC-V
    riscv64    - 64-bit RISC-V
    sparc      - Sparc
    sparcel    - Sparc LE
    sparcv9    - Sparc V9
    systemz    - SystemZ
    thumb      - Thumb
    thumbeb    - Thumb (big endian)
    wasm32     - WebAssembly 32-bit
    wasm64     - WebAssembly 64-bit
    x86        - 32-bit X86: Pentium-Pro and above
    x86-64     - 64-bit X86: EM64T and AMD64
    xcore      - XCore

อ้างอิง: LLVM ประชาสัมพันธ์ , LLVM กระทำ , เสียงดังกราว 11 เอกสาร


3

จะไม่แสดงรายการสามทั้งหมด แต่

llvm-as < /dev/null | llc -mcpu=help

อย่างน้อยจะแสดงรายการซีพียูทั้งหมด


1
นี่จะแสดงรายการเฉพาะตัวเลือกซึ่งสามารถใช้ได้กับเป้าหมาย (ค่าเริ่มต้น) ปัจจุบัน
osgx

1

ในกรณีที่คุณสนใจว่าเป้าหมายใดได้รับการสนับสนุนสำหรับการสร้าง LLVM หรือเสียงดังจากซอร์ส (ค่าสำหรับ-DLLVM_TARGETS_TO_BUILD) ให้มองหารายการไดเร็กทอรีย่อยในllvm/lib/Targetโฟลเดอร์ในการแจกจ่ายซอร์ส ตั้งแต่ 9.0.1 มี:

AArch64
AMDGPU
ARC
ARM
AVR
BPF
Hexagon
Lanai
MSP430
Mips
NVPTX
PowerPC
RISCV
Sparc
SystemZ
WebAssembly
X86
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.