2011-03-22 12 views
7

मैं एलएलवीएम के लिए नौसिखिया हूं और लिनक्स पर एक मानव पठनीय .ll फ़ाइल उत्पन्न करने का प्रयास करता हूं। मैंने llvm-gcc स्थापित किया लेकिन जैसा कि मैंने देखा कि यह केवल असेंबली कोड (-एस विकल्प) उत्पन्न कर सकता है। क्या llvm ऑनलाइन compiler द्वारा जेनरेट की गई चीज़ों को प्राप्त करने का कोई तरीका है?-emit-llvm लिनक्स

है यही कारण है कि मैं लिनक्स पर -S -emit-llvm साथ मिलती है:

.file "hello.c" 

    .ident "GCC: (Ubuntu/Linaro 4.5.1-7ubuntu2) 4.5.1 LLVM: " 

    .text 
    .globl main 
    .align 16, 0x90 
    .type main,@function 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    movl $.L.str, 4(%esp) 
    movl $1, (%esp) 
    call __printf_chk 
    xorl %eax, %eax 
    addl $8, %esp 
    popl %ebp 
    ret 
.Ltmp0: 
    .size main, .Ltmp0-main 

    .type .L.str,@object 
    .section .rodata.str1.1,"aMS",@progbits,1 
.L.str: 
    .asciz "hello world\n" 
    .size .L.str, 13 

    .section .note.GNU-stack,"",@progbits 

है यही कारण है कि मैं पाने के लिए कोशिश कर रहा हूँ: llvm-gcc -S -emit-llvm hello.c:

; ModuleID = '/tmp/webcompile/_7829_0.bc' 
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" 
target triple = "x86_64-linux-gnu" 

@.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x i8]*> [#uses=1] 

define i32 @main() nounwind { 
entry: 
    %0 = tail call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0] 
    ret i32 0 
} 

declare i32 @puts(i8* nocapture) nounwind 

खिड़कियों पर मैं सफलतापूर्वक एक ही कमांड के साथ इस फाइल को मिलता है।

उत्तर

7

कुछ LLVM-जीसीसी के ubuntu पैकेजिंग में भयानक टूट गया है। llvm-gcc का संस्करण 4.2.1 है, लेकिन यहां हम 4.5 देख रहे हैं। उबंटू बग की रिपोर्ट करें।

+0

-fplugin- arg-dragonegg-emit-ir – Nutel

+0

ठीक है, llvm-gcc dragonegg नहीं है। अगर उबंटू "धोखा" करने की कोशिश कर रहा है, तो यह फिर से उबंटू बग है :) –

2
LLVM tutorial से

:

$ llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc 

स्रोत hello.c बाईटकोड फ़ाइल hello.bc में संकलित करेंगे।

फिर LLVM विधानसभा कोड पर एक नज़र लेने के लिए LLVM-जिले उपयोगिता का उपयोग करें:

$ llvm-dis < hello.bc | less 
+1

मैंने कोशिश की लेकिन "llvm-dis: अवैध बिटकोड हस्ताक्षर" प्राप्त करें। मैंने ट्यूटोरियल से hello.c लिया, llvm-gcc किसी भी मुद्दे के बिना कोड संकलित करता है – Nutel

+1

एक बग होने लगता है https://bugs.launchpad.net/ubuntu/+source/dragonegg/+bug/712199 – Nutel

3

प्रयास करें:

llvm-gcc -c -emit-llvm source.cpp 

उपयोग -S के बजाय -c

अगर यह काम नहीं करता है, का उपयोग करें:

clang -c -emit-llvm source.cpp 

आप LLVM या तो उबंटू से सॉफ्टवेयर केंद्र या डाउनलोड LLVM-3.0-src और बजना-src उन्हें अपने संकलित करने के लिए निर्माण कर सकते हैं।

0

http://clang.llvm.org/get_started.html पर दिए गए चरणों को यह svn से llvm और clang इंस्टॉल करेगा। ../llvm/configure उपसर्ग =/usr/स्थानीय/usr के तहत उपकरण --enable-अनुकूलित -j4 स्थापित कर लेते हैं (स्थापित करने के लिए: तो आप स्रोत

से लेकिन मामूली अंतर के साथ बनाएंगे/स्थानीय)

(रिलीज स्थापित + डिबग के बजाय इस बात पर ज़ोर + का दावा है या डिबग के लिए ../llvm/configure साथ जाना + दावा मैं एक i5 तो मैं मेकअप का इस्तेमाल किया -j4

बदल आप चाहें के रूप में) है llvm-gcc नहीं clang का उपयोग करें। इसके बाद आप सीधे एक .ll उत्पन्न कर सकते हैं द्वारा: बजना एस -emit-LLVM असम्भव -ओ file.ll

और बजना -c -emit-LLVM असम्भव -ओ file.bc

यदि आप प्राप्त करना चाहते हैं और निम्न कार्य करते हैं: llc फ़ाइल।बीसी

इस ubuntu पर LLVM के नवीनतम संस्करण के लिए स्पष्ट तरीका


यही बात LLVM-जीसीसी-4.6 जो भी dragonEgg संस्करण मुझे लगता है के साथ होता है।

मैं हो रही है LLVM-जीसीसी संभावित असंगत प्लग-इन संस्करण

मैं इस बात बिल्कुल LLVM-जिले के साथ एक ही त्रुटि के बाद:

"LLVM-जिले: अमान्य bitcode हस्ताक्षर"।

+0

क्या आप जानते हैं कि 'config' (autoconf) स्क्रिप्ट एलएलवीएम महीने पहले हटा दी गई है? हम अब सीएमके पर भरोसा करते हैं। – Joky

+0

हां, मेरा जवाब 3 साल पहले था। यह उस समय की तरह था। –

+0

इसे याद किया, क्षमा करें। कुछ कारणों से मैं सबसे हालिया सामग्री को देखकर यहां समाप्त हुआ (या यही वह है जो मैंने कम से कम सोचा था ...) – Joky

0

आप, LLVM साथ खेलने के लिए स्रोत से इसे बनाने चाहते हैं: http://clang.llvm.org/get_started.html

अन्यथा, जल्दी शुरू करने के लिए, Ubuntu पर बजना स्थापित करने का प्रयास। यह एलएलवीएम के शीर्ष पर बनाया गया सी/सी ++ कंपाइलर है। आप सीधे क्लैंग से एलएलवीएम आईआर उत्पन्न करने में सक्षम होंगे।

llvm-gcc ड्रैगन-अंडे पर आधारित प्रतीत होता है, जो अब एलएलवीएम AFAIK में समर्थित नहीं है।