Mig veterligen producerar GCC fortfarande alltid textuell assemblerkod som parsas av assemblern.hanzibal skrev:GCC gör ju det om man vill men oftast är det väl något slags mellanspråk som väl iofs ofta ser ut som assembler fast mer generell.
LLVM har dock en inbyggd assembler som kan producera elf-object direkt utan att gå via textuell parsning av assemblerkoden.
Det är korrekt att både GCC och LLVM använder sig av "mellanspråk" (IR = Intermediate Language), i GCC är det gimple och i LLVM kallas det rätt och slätt LLVM IR.
Om man vill se hur det ser ut kan man i Clang/LLVM göra såhär:
Kod: Markera allt
$ cat hello_world.c
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
}
$ clang -S -emit-llvm hello_world.c -o -
; ModuleID = 'hello_world.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@.str = private unnamed_addr constant [14 x i8] c"hello world!\0A\00", align 1
define i32 @main() nounwind uwtable {
entry:
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0))
ret i32 0
}
declare i32 @printf(i8*, ...)