3

私はLLVMで独自の言語を書いており、stdとcustomの外部C関数を使用しています。現在、LLVM IR 用の C++ クラスを使用して宣言を追加しています。このような:

void register_malloc(llvm::Module *module) {
    std::vector<llvm::Type*> arg_types;
    arg_types.push_back(Type::getInt32Ty(getGlobalContext()));

    FunctionType* type = FunctionType::get(
            Type::getInt8PtrTy(getGlobalContext()), arg_types, false);

    Function *func = Function::Create(
                type, llvm::Function::ExternalLinkage,
                llvm::Twine("malloc"),
                module
           );
    func->setCallingConv(llvm::CallingConv::C);
}

void register_printf(llvm::Module *module) {
    std::vector<llvm::Type*> printf_arg_types;
    printf_arg_types.push_back(llvm::Type::getInt8PtrTy(getGlobalContext()));

    llvm::FunctionType* printf_type =
        llvm::FunctionType::get(
            llvm::Type::getInt32Ty(getGlobalContext()), printf_arg_types, true);

    llvm::Function *func = llvm::Function::Create(
                printf_type, llvm::Function::ExternalLinkage,
                llvm::Twine("printf"),
                module
           );
    func->setCallingConv(llvm::CallingConv::C);
}

数十の外部関数を定義するつもりですが、それらを定義する簡単な方法はありますか?

モジュールに C ヘッダー (または LLVM IR ファイル .ll) を「インクルード」することを考えています。しかし、これを行う方法の例が見つかりませんでした...

4

1 に答える 1

2

空の C ソースを作成し、必要なすべてのヘッダーをインクルードしてから、LLVM IR にコンパイルしclang -S -emit-llvmます。このソースには、ヘッダーからのすべての関数の宣言が含まれます。これを使用するllc -march=cpp out.llと、LLVM API を呼び出して特定の IR を生成する C++ ソースが生成されます。このコードをコピーしてプログラムに貼り付けることができます。

LLVM のビルド中に cpp バックエンドが有効になっていることを確認してください。

于 2015-09-28T05:41:44.640 に答える