2015-01-13 7 views
1
#include <stdio.h> 

int main() { 
    printf("hello world\n"); 
    return 0; 
} 

Я просто написал простой hello.c.Создание LLVM IR с использованием clang

Когда я набираю в

$ clang -O3 -emit-llvm hello.c -c -o hello.bc и $ lli hello.bc

в терминале он работает хорошо.

НО, когда я набираю в

$ clang -O3 -emit-llvm hello.c -S -o hello.ll и lli hello.ll.

ошибка происходит, показывая, что ошибка найдена в строке 21:

!0 = metadata !{metadata !"Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)"}

Он работает после того, как удалить эти 2 metadata. ЗАЧЕМ?

Это проблема clang или LLVM?

Информация о моей версии LLVM:

Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin14.0.0 
Thread model: posix 

// все команды, которые я использую выше приходят из http://llvm.org/docs/CommandGuide/index.html

ответ

2

Это швы быть ошибка в яблоке LLi версии. Я не могу воспроизвести это поведение с моей версией clang/lli, которая напрямую скомпилирована из svn (версия 3.5).

Излучаемый ИК:

; ModuleID = 'hello.cpp' 
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 
target triple = "x86_64-unknown-linux-gnu" 

@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1 

; Function Attrs: nounwind uwtable 
define i32 @main() #0 { 
    %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0)) 
    ret i32 0 
} 

; Function Attrs: nounwind 
declare i32 @printf(i8* nocapture readonly, ...) #1 

attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 

!llvm.ident = !{!0} 

!0 = metadata !{metadata !"clang version 3.5.0 "} 

и lli hello.ll печатает hello world. Он также печатает hello world, если я заменю строку metadata той, которую вы опубликовали.

Возможно, вы должны указать отчет об ошибке для Apple lli.

+0

Спасибо, я думаю, это ошибка. – Wentao

+0

@ Rahn Я также могу подтвердить, что ваш код работает нормально, используя ваши инструкции, когда я получаю свой llvm/clang с https://github.com/evhan55/emsdk_portable PS. что репо кажется более последовательным выпуском llvm/clang ... он дает вам \t clang --version \t clang version 3.3 –

Смежные вопросы