2016-06-04 14 views
2

ich dies kompilieren:Mit Clang und LLVM

int main(){ 
} 

Mit Klirren, diese Befehlszeile:

clang++.exe -S -o %OUTFILE%.clang -emit-llvm %INFILE% -I. -I%INCLUDE_PATH% -std=c++14 -ftemplate-depth=1000 

Was mich llvm Byte-Code gibt.

Dann benutze ich llc wie so, die Byte-Code in C-Code zu konvertieren:

llc "%IN_FILE%.clang" -march=c -o foo.c 

Und diesen Fehler:

error: unterminated attribute group 
attributes #0 = { norecurse nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } 

Was mache ich falsch? Diese

ist, was Klirren ++ mir gibt:

; ModuleID = 'C:\Users\Owner\Documents\C++\SVN\prototypeInd\util\StaticBigInt.cpp' 
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" 
target triple = "x86_64-pc-windows-msvc18.0.0" 

; Function Attrs: norecurse nounwind readnone uwtable 
define i32 @main() #0 { 
entry: 
    ret i32 0 
} 

attributes #0 = { norecurse nounwind readnone uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } 

!llvm.module.flags = !{!0} 
!llvm.ident = !{!1} 

!0 = !{i32 1, !"PIC Level", i32 2} 
!1 = !{!"clang version 3.8.0 (branches/release_38)"} 

Hinweis: Ich verwende clang Version 3.8 und llc Version 3.4

+0

Es sieht wie eine Versionsinkompatibilität zwischen 'clang' und' llc' aus. Können Sie eine komplette "% IN_FILE% .clang" posten? – deniss

+0

@deniss Sicher ... ein Moment – DarthRubik

+0

Ihr Code ist in Ordnung mit der aktuellen 'llc' Version, außer dass [c backend in 3.1 entfernt wurde] (http://llvm.org/releases/3.1/docs/ReleaseNotes). html # whatsnew) – deniss

Antwort

2

Wenn Sie einen Befehl ausführen, wie:

clang -S -emit-llvm ... 

Dann sendet der Compiler keine IR in einer Bitcode-Form, sondern von Menschen lesbar Darstellung.

Es macht Sinn, wenn alle Werkzeuge, die Sie verwenden, die gleichen Versionen haben, oder wenn Sie nur die Ausgabe manuell überprüfen möchten.

Allerdings kann die menschenlesbare IR mit alten Tools inkompatibel sein.

In diesem Fall kann ich empfehlen direkt zu verwenden Bitcode (beachten Sie, dass es keinen -S Parameter mehr ist):

clang -emit-llvm 
+0

"nein -S Parameter mehr" ... Seit welcher Version? –

+0

Da wir keine menschenlesbare IR benötigen. Es geht nicht um Versionen. Entschuldigen Sie das Durcheinander. – AlexDenisov

+0

Auch in Bitcodeform ist IR nicht abwärtskompatibel. –

1

C-Backend in LLVM vor einigen Jahren entfernt wurde. Es scheint, dass Sie versuchen, LLVM IR von der letzten LLVM-Version zu llc von alten LLVM zu füttern. Dies wird sicherlich nicht unterstützt - die IR ist nicht kompatibel zwischen den Versionen.