【问题标题】:How to Compile and Run llc-3.4 generated C++ code using native compiler(g++)?如何使用本机编译器(g++)编译和运行 llc-3.4 生成的 C++ 代码?
【发布时间】:2014-07-26 20:13:17
【问题描述】:

注意:

这项工作的目标是在非 c++11 编译器中使用一些 c++11 功能

以下步骤已完成,

  1. 生成llvm位码,

    clang++ -emit-llvm -c test.cc -o test.o
    
  2. 将llvm位码转换为c++代码,

    llc-3.4 test.o -o test.cpp -march=cpp
    
  3. 使用 GNU g++ 编译 llvm 生成的 c++ 代码时出现以下错误

    arunprasadr@geekvm:~/works/myex/llvm$ g++ test.cpp test.cpp:3:23:致命错误:llvm/Pass.h:没有这样的文件或目录 编译终止。

我什至尝试添加 llvm-dev 包含路径,但仍然失败,

arunprasadr@geekvm:~/works/myex/llvm$ g++ test.cpp -I/usr/include/llvm-3.4 -I /usr/include/llvm-c-3.4
In file included from /usr/include/llvm-3.4/llvm/Support/type_traits.h:20:0,
                 from /usr/include/llvm-3.4/llvm/ADT/StringRef.h:13,
                 from /usr/include/llvm-3.4/llvm/PassRegistry.h:20,
                 from /usr/include/llvm-3.4/llvm/PassSupport.h:26,
                 from /usr/include/llvm-3.4/llvm/Pass.h:366,
                 from test.cpp:3:
/usr/include/llvm-3.4/llvm/Support/DataTypes.h:48:3: error: #error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h"
/usr/include/llvm-3.4/llvm/Support/DataTypes.h:52:3: error: #error "Must #define __STDC_CONSTANT_MACROS before " "#including Support/DataTypes.h"
In file included from /usr/include/llvm-3.4/llvm/ADT/SmallVector.h:19:0,
                 from /usr/include/llvm-3.4/llvm/PassAnalysisSupport.h:22,
                 from /usr/include/llvm-3.4/llvm/Pass.h:367,
                 from test.cpp:3:
/usr/include/llvm-3.4/llvm/Support/MathExtras.h: In function ‘bool llvm::isInt(int64_t)’:
/usr/include/llvm-3.4/llvm/Support/MathExtras.h:264:33: error: there are no arguments to ‘INT64_C’ that depend on a template parameter, so a declaration of ‘INT64_C’ must be available [-fpermissive]
/usr/include/llvm-3.4/llvm/Support/MathExtras.h:264:33: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/usr/include/llvm-3.4/llvm/Support/MathExtras.h:264:65: error: there are no arguments to ‘INT64_C’ that depend on a template parameter, so a declaration of ‘INT64_C’ must be available [-fpermissive]
/usr/include/llvm-3.4/llvm/Support/MathExtras.h: In function ‘bool llvm::isUInt(uint64_t)’:
/usr/include/llvm-3.4/llvm/Support/MathExtras.h:290:36: error: there are no arguments to ‘UINT64_C’ that depend on a template parameter, so a declaration of ‘UINT64_C’ must be available [-fpermissive]
/usr/include/llvm-3.4/llvm/Support/MathExtras.h: In function ‘bool llvm::isIntN(unsigned int, int64_t)’:
/usr/include/llvm-3.4/llvm/Support/MathExtras.h:322:33: error: ‘INT64_C’ was not declared in this scope

【问题讨论】:

  • cpp 后端生成一个 C++ 代码,它将构建您的 LLVM IR 模块。显然,您想要一些不同的东西 - 就像旧的 C 后端所做的那样,但它早就从 LLVM 中删除了,而且它从来没有真正运作良好。
  • 谢谢@SK-logic,听到这我有点失望。是否有任何其他替代方案可以从 LLVM IR 生成 C 代码?

标签: llvm llvm-clang llvm-gcc


【解决方案1】:

您需要根据llvm-config 提供的标志进行编译。如下图所示:

输入.cc

#include <iostream>

int main() {
    std::cout << "hello" << std::endl;
}

命令行

[3:21pm][wlynch@apple /tmp] /opt/llvm/3.4/bin/clang++ -emit-llvm -c input.cc -o input.o
[3:22pm][wlynch@apple /tmp] /opt/llvm/3.4/bin/llc input.o -o llvm.cc -march=cpp
[3:22pm][wlynch@apple /tmp] /opt/llvm/3.4/bin/clang++ -gcc-toolchain /opt/gcc/4.8.2/ llvm.cc `/opt/llvm/3.4/bin/llvm-config --cxxflags --ldflags --libs`

为了提供帮助,这里是我机器上 llvm-config 行的输出:

-I/opt/llvm/3.4/include -DNDEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -O3 -fomit-frame-pointer
-std=c++11 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fPIC
-Woverloaded-virtual -Wcast-qual -L/opt/llvm/3.4/lib -lz -lpthread -ltinfo -lrt
-ldl -lm -lLLVMInstrumentation -lLLVMIRReader -lLLVMAsmParser -lLLVMDebugInfo
-lLLVMOption -lLLVMLTO -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter
-lLLVMBitReader -lLLVMTableGen -lLLVMR600CodeGen -lLLVMR600Desc -lLLVMR600Info
-lLLVMR600AsmPrinter -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen
-lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo
-lLLVMSystemZAsmPrinter -lLLVMHexagonCodeGen -lLLVMHexagonAsmPrinter
-lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc
-lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMCppBackendCodeGen
-lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info
-lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen
-lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler
-lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo
-lLLVMMipsAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser
-lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAArch64Disassembler
-lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info
-lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMPowerPCCodeGen
-lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo
-lLLVMPowerPCAsmPrinter -lLLVMSparcCodeGen -lLLVMSparcDesc -lLLVMSparcInfo
-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG
-lLLVMAsmPrinter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils
-lLLVMMCDisassembler -lLLVMMCParser -lLLVMInterpreter -lLLVMMCJIT -lLLVMJIT
-lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts -lLLVMInstCombine
-lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMRuntimeDyld
-lLLVMExecutionEngine -lLLVMTarget -lLLVMMC -lLLVMObject -lLLVMCore
-lLLVMSupport

【讨论】:

  • 感谢您的回答@sharth。它现在正在生成可执行文件,但没有按预期运行,请参阅pastebin.com/jHZmBh5M
  • 是的。我不知道llc 应该产生什么。这只是解决了您看到的编译器错误的问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2022-01-09
  • 2020-12-11
  • 2013-12-07
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多