1

サンプル C コードをコンパイルするために llvm オンライン コンパイラを使用しました。

int main() { return 0; }

生成された LLVM アセンブリ、

 ; ModuleID = '/tmp/webcompile/_31588_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-S128"
target triple = "x86_64-unknown-linux-gnu"

define i32 @main() nounwind uwtable {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  ret i32 0
}

次に、LLVM アセンブリを obj ファイルにコンパイルし、

llc -filetype=obj a.ll

を使用してobjファイルをリンクしようとするとlink.exe a.o、エラーが発生しました

 fatal error LNK1107: invalid or corrupt file: cannot read at 0x438

link.exe にフィードする正しい obj ファイルを生成するにはどうすればよいですか?


詳しくは

  • Visual Studio 11 を使用して LLVM を構築しました。cygwin をインストールしていませんでした。
  • link.exe も Visual Studio 11 のものです
  • LLVM は最新のソース コードから構築されました。

VC++ コンパイラを使用して同じコードをアセンブリにコンパイルすると、次のようになります。

; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.50402.0 

include listing.inc

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC  main
; Function compile flags: /Odtp
_TEXT   SEGMENT
main    PROC
; File c:\tmp\u.c
; Line 1
    xor eax, eax
    ret 0
main    ENDP
_TEXT   ENDS
END

llc -filetype=asm j.ll次のコードを生成します。ml.exe でも失敗します。

    .def     _main;
    .scl    2;
    .type   32;
    .endef
    .text
    .globl  _main
    .align  16, 0x90
_main:                                  # @main
# BB#0:
    pushl   %eax
    movl    $0, (%esp)
    xorl    %eax, %eax
    popl    %edx
    ret
4

2 に答える 2

1

あなたは奇妙な土地にいます、あなたは読むことができます:http: //llvm.org/docs/GettingStartedVS.htmlこれは役立つかもしれません

于 2012-04-10T03:20:40.563 に答える
1

ターゲット トリプレットに記載されているように、IR は x86-64/Linux 用です。そのため、llc は (デフォルトで) COFF ではなく ELF オブジェクト ファイルを生成します。確かにlink.exeはそれを受け入れません。

ターゲットトリプルをいくつかのウィンドウに変更して、すべてがうまくいくと仮定することはできないことに注意してください。

  1. COFF オブジェクト コードの発行は WIP です
  2. C/C++ はターゲット非依存の言語ではないため、ここでターゲット非依存の IR を取得することはできません: http://llvm.org/docs/FAQ.html#platformindependent
于 2012-04-10T07:50:19.310 に答える