天道酬勤,学无止境

如何直接从 LLVM 源代码树使用新编译的 LLVM 工具?(How do I use a freshly compiled LLVM tool directly from LLVM source tree?)

问题

我正在编写一个针对 X86 架构的MachineFunctionPass ,它会生成一个经过修改的llc二进制文件。

为了测试我修改过的llc版本,我创建了一堆.c程序,它们的 MIR 将由我的通行证处理。

为了干净起见,我将包含源代码的目录直接添加到 LLVM 的源代码树中,特别是在$llvm_src_dir/lib/Target/X86/$examples_dir :然后我通过附加add_subdirectory()指令将其插入到 LLVM 构建系统中到$llvm_src_dir/lib/Target/X86/CMakeLists.txt

通过这种方式,我将能够直接从 LLVM 的构建目录中构建所有内容。

现在:如何在$examples_dir/CMakeLists.txt指定使用 LLVM 的 in-tree llc

源码树结构

这是源的目录结构。 我省略了所有根目录的子目录,因为我只包含了“有趣的”。

LLVM 在tools/llc定义了llc目标,而我的源代码位于目录中的更深处,如下树所示:

llvm_src_dir
├── bindings
├── cmake
├── docs
├── examples
├── include
├── lib
    └── Target
        └── X86
            /* 
             * My git repo is here. LLVM's and
             * my MachineFunctionPass' files
             * live here 
            */
            ├── .git
            ├── CMakeLists.txt // This is LLVM's X86 CMakeLists.txt
            └── examples
                └── CMakeLists.txt // My CMakeLists.txt
├── projects
├── resources
├── runtimes
├── test
├── tools
    └── llc
        └── CMakeLists.txt // this is where LLVM's llc target is defined
├── unittests
└── utils

lib/Target/X86/CMakeLists.txt

这是我编辑目标架构的CMakeLists.txt的方式:

set (CMAKE_CXX_STANDARD 14)
set(LLVM_TARGET_DEFINITIONS X86.td)

tablegen(LLVM X86GenAsmMatcher.inc -gen-asm-matcher)
tablegen(LLVM X86GenAsmWriter.inc -gen-asm-writer)
tablegen(LLVM X86GenAsmWriter1.inc -gen-asm-writer -asmwriternum=1)
tablegen(LLVM X86GenCallingConv.inc -gen-callingconv)
tablegen(LLVM X86GenDAGISel.inc -gen-dag-isel)
tablegen(LLVM X86GenDisassemblerTables.inc -gen-disassembler)
tablegen(LLVM X86GenEVEX2VEXTables.inc -gen-x86-EVEX2VEX-tables)
tablegen(LLVM X86GenFastISel.inc -gen-fast-isel)
tablegen(LLVM X86GenGlobalISel.inc -gen-global-isel)
tablegen(LLVM X86GenInstrInfo.inc -gen-instr-info)
tablegen(LLVM X86GenRegisterBank.inc -gen-register-bank)
tablegen(LLVM X86GenRegisterInfo.inc -gen-register-info)
tablegen(LLVM X86GenSubtargetInfo.inc -gen-subtarget)

if (X86_GEN_FOLD_TABLES)
    tablegen(LLVM X86GenFoldTables.inc -gen-x86-fold-tables)
endif ()

add_public_tablegen_target(X86CommonTableGen)

set(MY_SOURCES
        a.cpp
        b.cpp
        c.cpp
        )

set(sources
        ShadowCallStack.cpp
        X86AsmPrinter.cpp
        X86CallFrameOptimization.cpp
        X86CallingConv.cpp
        X86CallLowering.cpp
        X86CmovConversion.cpp
        X86DomainReassignment.cpp
        X86ExpandPseudo.cpp
        X86FastISel.cpp
        X86FixupBWInsts.cpp
        X86FixupLEAs.cpp
        X86AvoidStoreForwardingBlocks.cpp
        X86FixupSetCC.cpp
        X86FlagsCopyLowering.cpp
        X86FloatingPoint.cpp
        X86FrameLowering.cpp
        X86InstructionSelector.cpp
        X86ISelDAGToDAG.cpp
        X86ISelLowering.cpp
        X86IndirectBranchTracking.cpp
        X86InterleavedAccess.cpp
        X86InstrFMA3Info.cpp
        X86InstrFoldTables.cpp
        X86InstrInfo.cpp
        X86EvexToVex.cpp
        X86LegalizerInfo.cpp
        X86MCInstLower.cpp
        X86MachineFunctionInfo.cpp
        X86MacroFusion.cpp
        X86OptimizeLEAs.cpp
        X86PadShortFunction.cpp
        X86RegisterBankInfo.cpp
        X86RegisterInfo.cpp
        X86RetpolineThunks.cpp
        X86SelectionDAGInfo.cpp
        X86ShuffleDecodeConstantPool.cpp
        X86SpeculativeLoadHardening.cpp
        X86Subtarget.cpp
        X86TargetMachine.cpp
        X86TargetObjectFile.cpp
        X86TargetTransformInfo.cpp
        X86VZeroUpper.cpp
        X86WinAllocaExpander.cpp
        X86WinEHState.cpp
        ${MY_SOURCES}
        )

add_llvm_target(X86CodeGen ${sources})

add_subdirectory(AsmParser)
add_subdirectory(Disassembler)
add_subdirectory(InstPrinter)
add_subdirectory(MCTargetDesc)
add_subdirectory(TargetInfo)
add_subdirectory(Utils)
add_subdirectory(examples) // my examples directory

我已经尝试过的

我目前正在使用find_path()来查找llc但这需要llc已经编译,因此如果我不事先编译llc我的示例CMakeLists.txt将无法通过验证。

假设路径存在,我最终使用add_custom_command()指令在我的CMakeLists.txt使用llc ,但在我看来这太hacky了。

基本上,我需要将llc目标添加为我的目标的依赖项,然后使用llc的路径将我的示例的.bc文件编译为.s

有任何想法吗?

非常感谢!

回答1

我看到了两种可能的解决方案,现在让我介绍一个更简单的解决方案。

project(nested-toolchain C CXX)

# Assume that `llc` target is created somewhere within project
# Even if it is created in later `add_subdirectory` calls,
# We can defer evaluation to its path using generator expression $<TARGET_FILE:llc>

# This is the magic.
# It tells cmake how to produce test1.s from test1.bc using llc binary
# Also will track test1.bc changes and set test1.s as dirty when needed
add_custom_command(OUTPUT test1.s COMMAND $<TARGET_FILE:llc> test1.bc DEPENDS test1.bc)
add_custom_command(OUTPUT test2.s COMMAND $<TARGET_FILE:llc> test2.bc DEPENDS test2.bc)

# Now merge custom commands into single target which can be called by make/ninja/...
# simply call `make tests` to run two commands listed above (and compile llc before that)
add_custom_target(tests SOURCES test1.s test2.s)

总结一下:首先我们知道我们的 CMake 项目可以从 llvm-sources 的某个地方生成llc二进制文件。 此二进制文件可用于生成指定了魔术命令的test.s文件。 它们依赖于相应的.bc文件。 这些.bc文件通过add_custom_target加入到单个目标tests

我已经使用add_custom_target来保持示例最小化,它有一个缺陷:调用make tests将始终调用所有llc命令,因为自定义目标始终被认为是“过时的”。

如果你想在.s文件上使用另一个工具,我建议类比地链接另一个add_custom_command并使用add_custom_target来完成链。

只要您正在测试单个二进制文件 ( llc ),这种方法就应该有效。 如果您想测试整个工具链,我会选择try_compile

为了完整llc.cpp ,对于给定的llc.cpp文件:

// Just print args
#include <iostream>
int main(int argc, char **argv) {
  for (int i = 0; i < argc; i++) {
    std::cout << argv[i] << ' ';
  }
  std::cout << "\n";
  return 0;
}

ninja tests结果:

$ ninja tests
[1/2] Generating test2.s
/home/stackoverflow/nested-toolchain/build/llc test2.bc 
[2/2] Generating test1.s
/home/stackoverflow/nested-toolchain/build/llc test1.bc 
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用llvm生成机器代码(How to generate machine code with llvm)
    问题 我目前正在使用llvm进行编译器项目。 我遵循了各种教程,以至于我有一个解析器来创建语法树,然后使用提供的IRBuilder将树转换为llvm模块。 我的目标是创建一个可执行文件,而下一步我很困惑。 我发现的所有教程都只是创建llvm模块,并使用Module.dump()打印出程序集。 另外,我只能找到针对llvm开发人员的文档,而不是该项目的最终用户的文档。 如果要生成机器代码,下一步是什么? llvm-mc项目看起来像它可以完成我想要的,但是我找不到关于它的任何文档。 也许我期望llvm做一些它不会做的事情。 我的期望是,我可以构建一个模块,然后会有一个可以与该模块一起调用的API,然后将创建一个目标三元组并生成一个目标文件。 我发现了有关生成JIT的文档和示例,对此我不感兴趣。 我正在寻找如何产生已编译的二进制文件。 如果有影响,我正在OS X上工作。 回答1 使用llc -filetype=obj从IR发出可链接的目标文件。 您可以查看llc的代码,以查看它发出的LLVM API调用以发出此类代码。 至少对于Mac OS X和Linux,以这种方式发出的对象应该非常好(即,目前这不是“ alpha quality”选项)。 LLVM不包含链接器(尚未!)。 因此,要将这个目标文件实际链接到某些可执行文件或共享库中,您将需要使用系统链接器。 请注意
  • LLVM项目的目录布局介绍
    LLVM项目的目录布局介绍 从git获取llvm项目的源码方式: git clone https://github.com/llvm/llvm-project.git 我使用的版本分支是:llvmorg-9.0.0 下载源码后,进入llvm-project目录包括如下内容: 接下来将对llvm-project中每个目录的其内容做简介 llvm-project/clang Clang是一个基于llvm上的编译器前端,支持编译的高级语言有C/C++/Objective-C等,它拥有惊人的快速编译代码的能力(如,在Debug下编译Objective-C"比GCC快大约3倍")。Clang为用户提供更加友好和清晰有用的报错/警告信息,同时提供了一个用于构建出色的源代码级工具的平台。例如,将Clang作为库构建的工具——Clang静态分析器,它是一种可自动查找代码bug的工具。 llvm-project/clang-tools-extra clang-tools-extra作为LLVM和Clang基础架构项目的一部分。这些工具独立开来,以便于更加轻便地检出Clang的核心代码。 如果要将该项目添加到LLVM中构建时,需要将其添加到llvm/tools目录中,并命名为extra。 llvm-project/compiler-rt compiler-rt
  • 编译器 LLVM Clang原理与实战 制作自己的编译器 source-to-source 源代码转换 编译遍 compile pass 代码插桩
    编译器 LLVM Clang原理与实战 参考1 clang LLVM CMU 教案 深入剖析-iOS-编译-Clang—LLVM LLVM_proj LLVM编程索引 llvm源码浏览带跳转 llvm-clang-samples llvm-tutor A collection of LLVM passes (with tests and build scripts) 简介 LLVM的命名最早来源于底层语言虚拟机(Low Level Virtual Machine)的缩写。它是一个用于建立编译器的基础框架,以C++编写。创建此工程的目的是对于任意的编程语言,利用该基础框架,构建一个包括编译时、链接时、执行时等的语言执行器。目前官方的LLVM只支持处理C/C++,Objective-C三种语言,当然也有一些非官方的扩展,使其支持ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java bytecode、Objective-C、Python、Ruby、Rust、Scala以及C# llvm的主要作用是它可以作为多种语言的后端,它可以提供可编程语言无关的优化和针对很多种CPU的代码生成功能。此外llvm目前已经不仅仅是个编程框架,它目前还包含了很多的子项目,比如最具盛名的clang(LLVM编译器的C家族语言编译器前端)
  • 2018年最好的软件开发、云计算、大数据分析和机器学习工具
    InfoWorld编辑和评论家评选出今年最好的软件开发,云计算,大数据分析和机器学习工具。欢迎来到InfoWorld的年度技术奖,这是我们对信息技术领域中最好,最具创新性,最重要的产品的年度庆典。 在这个2019年版的奖项中,你可能会猜出有容器,云原生应用程序栈,分布式数据处理系统和机器学习是主要的主题。在我们的16项获奖技术中,你将找到三项领先的机器学习库,一项加速深度学习的分布式培训框架,以及一项通过特征工程,模型选择,培训和优化来指导非专家的自动化平台。与其他任何产品类别相比,这使机器学习成为更多选择,包括软件开发,这反映了该领域令人吃惊的活动水平。三项数据库技术今年出现在我们的赢家名单李,包括一项宽列数据存储,一项多功能数据存储,以及一项与数据存储一样多的应用程序平台的数据库。因为数据总是必须从这里迁移到那里,最好是实时,我们还包括两个用于构建流处理应用程序的领先平台。请继续阅读以了解今年的获奖者。1、KubernetesKubernetes(又名K8s)在过去几年里有惊人的增长。它曾经是众多容器编排系统中的一种,但现在它正在迅速成为普遍的标准平台,无论是在主要的云提供商,还是在本地的企业级安装中。如果你处于运营领域,那么花时间在Kubernetes上将有可能获得回报,因为开源项目将继续其无情的进军。基于十年来运行Google海量数据中心的想法和经验教训
  • 学习编写编译器(Learning to write a compiler [closed])
    问题 Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers. Want to improve this question? Update the question so it's on-topic for Stack Overflow. Closed 6 years ago. This question's answers are a community effort. Edit existing answers to improve this post. It is not currently accepting new answers or interactions. Preferred languages: C/C++, Java, and Ruby. I am looking for some helpful books/tutorials on how to write your own compiler simply for educational purposes. I am most familiar with C/C++, Java, and Ruby, so I prefer resources that
  • 推荐系统大规模特征工程与FEDB的Spark基于LLVM优化
    今天给大家分享第四范式在推荐系统大规模特征工程与Spark基于LLVM优化方面的实践,主要包括以下四个主题。 大规模推荐系统特征工程介绍SparkSQL与FESQL架构设计基于LLVM的Spark性能优化推荐系统与Spark优化总结 大规模推荐系统特征工程介绍 推荐系统在新闻推荐、搜索引擎、广告投放以及最新很火的短视频App中都有非常广阔的应用,可以说绝大部分互联网企业和传统企业都可以通过推荐系统来提升业务价值。 我们对常见的推荐系统架构进行分层,离线层(Offline layer)主要负责处理存在HDFS的大规模数据进行预处理和特征抽取,然后使用主流的机器学习训练框架进行模型训练并且导出模型,模型可以提供给在线服务使用。流式层(Stream layer)我们也称近线层,是介于离线和在线的中间层,可使用流式计算框架如Flink进行近实时的特征计算和生成,结果保存在NoSQL或者关系型数据库中给在线服务使用。在线层(Online layer)就包括了与用户交互的UI以及在线服务,通过实时的方式提取流式特征和使用离线模型进行预估,实现推荐系统在线的召回和推荐功能,预估结构和用户反馈也可以通过事件分发器写会流失计算的队列以及离线的Hadoop存储中。 本次分享重点会介绍离线层的优化,在大规模的推荐系统中离线存储的数据可能到PB级,常用的数据处理有ETL(Extract
  • LLVM到底是什么?(What exactly is LLVM?)
    问题 我一直都在听有关LLVM的信息。 它在Perl中,然后在Haskell中,然后有人以其他某种语言使用它? 它是什么? 它与GCC有什么真正的区别(视角=安全性等)? 回答1 LLVM是一个用于构造,优化和产生中间和/或二进制机器代码的库。 LLVM可用作编译器框架,您可以在其中提供“前端”(解析器和词法分析器)和“后端”(将LLVM的表示形式转换为实际机器代码的代码)。 LLVM还可以充当JIT编译器-它支持x86 / x86_64和PPC / PPC64程序集生成,并具有针对编译速度的快速代码优化。 不幸的是,自2013年以来已被禁用,它可以在演示页面上播放从C或C ++代码生成的LLVM机器代码。 回答2 LLVM的一个很好的总结是: 在前端,您可以使用Perl和许多其他高级语言。 在后端,您具有直接在计算机上运行的本机代码。 中间是您的中间代码表示形式。 如果每种高级语言都可以用这种LLVM IR格式表示,那么基于此IR的分析工具就可以轻松地重用-这是基本原理。 回答3 LLVM(以前是指“低级虚拟机”,但现在不再是)是一种用C ++编写的编译器基础结构,旨在对所编写程序的编译时,链接时,运行时和“空闲时”进行优化。以任意编程语言。 LLVM最初是为C / C ++实现的,其与语言无关的设计(并取得了成功)因此产生了各种各样的前端,包括Objective C
  • 将 LLVM Clang 4.xx / 5.xx / 6.xx 集成到 Visual Studio 2017 中(Integrate LLVM Clang 4.x.x / 5.x.x / 6.x.x into Visual Studio 2017)
    问题 适用于 Windows 的官方 LLVM 4.0 版本与 Visual Studio 集成到 Visual Studio 2015。不幸的是,它仍然不支持 Visual Studio 2017。 当您尝试将项目的平台工具集设置为LLVM-vs2014 ,会弹出错误。 你知道有什么方法可以让它工作吗? 更新 在 2018 年,LLVM 6.0 官方仍然不支持与 Visual Studio 2017(版本 15.XX)集成,仅与 Visual Studio 2015(版本 14.XX)工具集集成。 回答1 它需要一些仅随 C++ v140 工具集提供的 msbuild 目标,并且 VS 2017 默认仅安装 v141 工具集。 如果您打开 VS 2017 安装程序,找到 v140 工具集的复选框并安装它,然后正确的 C++ msbuild 目标将可用并且事情将起作用。 回答2 最后,我找到了一个出色的 GitHub 存储库,其中包含所需的 MSBuild 平台工具集,它将 LLVM clang 5.0.0 集成到 Visual Studio 2017 中。 按照 README 文件的说明操作后,您将拥有两个新的平台工具集LLVM-vs2017和LLVM-vs2017_xp 。 问题解决了。 更新 我制作了一个fork ,它针对 LLVM 6.0.0 进行了更新,并通过提供
  • 编译器是否总是产生汇编代码?(Does a compiler always produce an assembly code?)
    问题 从C ++中的思考-第1卷: 在第二遍中,代码生成器遍历解析树并为树的节点生成汇编语言代码或机器代码。 至少在GCC中,如果我们提供生成汇编代码的选项,则编译器会通过创建一个包含汇编代码的文件来遵守。 但是,当我们简单地运行不带任何选项的gcc命令时,它不会在内部产生汇编代码吗? 如果是,那么为什么它需要首先产生一个汇编代码,然后将其翻译成机器语言? 回答1 我认为,TL:DR不同的目标文件格式/从历史上更容易移植到新的Unix平台是gcc保持汇编程序与编译器分离的主要原因之一。 在gcc之外,主流的x86 C和C ++编译器(clang / LLVM,MSVC,ICC)直接用于机器代码,如果需要,可以选择打印asm文本。 LLVM和MSVC附带完整的工具链,而不仅仅是编译器。 (还带有汇编器和链接器)。 LLVM已经将目标文件处理作为一种库函数,因此它可以使用它来代替写出asm文本来馈送到单独的程序。 较小的项目通常选择将目标文件格式的详细信息留给汇编器。 例如FreePascal可以直接在其一些目标平台上访问目标文件,否则只能访问asm。 有许多主张(1、2、3、4),几乎所有的编译器都使用asm文本,但是对于许多使用大量开发人员的最大的,使用最广泛的编译器(GCC除外)而言,事实并非如此。 C编译器倾向于只针对单个平台(例如供应商的微控制器编译器)并被编写为
  • 为什么 GCC-Windows 依赖于 cygwin?(Why does GCC-Windows depend on cygwin?)
    问题 我不是 C++ 开发人员,但我一直对编译器很感兴趣,而且我对修补 GCC 的一些东西(尤其是 LLVM)很感兴趣。 在 Windows 上,GCC 需要 POSIX 仿真层(cygwin 或 MinGW)才能正确运行。 这是为什么? 我使用了许多其他软件,用 C++ 编写并针对不同平台(Subversion、Firefox、Apache、MySQL)进行交叉编译,它们都不需要 cygwin 或 MinGW。 我对 C++ 最佳实践编程的理解是,您可以编写合理的平台中立代码并处理编译过程中的所有差异。 那么与 GCC 有什么关系呢? 为什么它不能在 Windows 上本地运行? 编辑: 好的,到目前为止的两个回复基本上说,“GCC 使用 posix 层,因为它使用 posix 标头”。 但这并不能真正回答问题。 假设我已经有一组我最喜欢的标准库的头文件。 为什么我仍然需要 posix 标头? GCC 是否需要 cygwin/mingw 才能实际运行? 或者它只需要头文件和库的仿真层? 如果是这样,为什么我不能给它一个包含所需资源的“lib”目录? 再次编辑: 好的,我会再次尝试澄清问题... 我还用 D 编程语言编写代码。 官方编译器名为“dmd”,Windows 和 linux 都有官方编译器二进制文件。 Windows 版本不需要任何类型的 POSIX 仿真。 Linux
  • 在应用程序中嵌入 C++ 编译器(Embed C++ compiler in application)
    问题 着色器不是很酷吗? 你可以只输入一个普通的字符串,只要它是有效的源代码,它就会编译、链接和执行。 我想知道是否有一种方法可以将 GCC 嵌入用户应用程序中,以便它“自给自足”,例如具有编译与自身兼容的本机二进制文件的内部能力。 到目前为止,我一直在从应用程序内部启动的进程中调用独立的 GCC,但我想知道是否有一些 API 或某些东西可以允许“直接”使用而不是独立的编译器。 另外,在可能的情况下,是否允许? 编辑:虽然最初的问题是关于 CGG,但我也想了解如何嵌入 LLVM/Clang 的信息。 现在对不能将 2 + 2 放在一起的人进行了特殊编辑:问题询问如何在可执行文件中嵌入 GCC 或 Clang,以允许从代码中使用内部 API 而不是从命令提示符调用编译. 回答1 我会为使用 Clang/LLVM 而不是 GCC 的建议添加 +1。 几个很好的理由: 它更加模块化和灵活编译时间可以大大低于 GCC 它支持您在评论中列出的平台它有一个可以在内部使用的 API string source = "app.c"; string target= "app"; llvm::sys::Path clangPath = llvm::sys::Program::FindProgramByName("clang"); // arguments vector<const char *>
  • 如何从内核树中构建 BPF 程序(how to build BPF program out of the kernel tree)
    问题 内核在samples/bpf提供了许多示例。 我有兴趣在树之外构建一个示例,就像我们构建一个内核模块一样,其中Makefile可以很简单。 可以对 bpf 做同样的事情吗? 我通过从samples/bpf/Makefile删除不必要的部分并保持对libbpf和其他人的依赖来libbpf它,但结果证明并不是那么容易。 例如,尝试在内核树之外构建samples/bpf/bpf_tcp_kern.c ,使用以下命令行(我查看了 samples/bpf/Makefile,以及make samples/bpf V=1的输出): clang -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/5/include \ -I/home/mark/work/net-next.git/arch/x86/include -I/home/mark/work/net-next.git/arch/x86/include/generated -I./include -I/home/mark/work/net-next.git/arch/x86/include/uapi -I/home/mark/work/net-next.git/arch/x86/include/generated/uapi -I/home/mark/work/net-next.git
  • 如何将 C++ 文件编译为 WebAssembly?(How do I compile a C++ file to WebAssembly?)
    问题 假设我有一个简单的、自包含的 C++ 文件( math.cpp ),如下所示: int add(int x, int y) { return x + y; } 我将如何将其编译为 WebAssembly ( math.wasm )? 注意:我正在使用 Clang 工具链。 回答1 我发现这个要点非常有帮助。 基本上,这是以下步骤: (使用-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly构建 llvm 和 clang 5.0.0 或更高-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly ) 使用 clang 将 .cpp 源编译为 llvm bitcode: clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc 将位码编译为 s-assembly: llc -asm-verbose=false -o math.s math.bc 使用 binaryen 的 s2wasm 工具创建一个 .wast 文件s2wasm math.s > math.wast 使用 WABT 的 wast2wasm 工具将文本 .wast 文件转换为二进制 .wasm: wast2wasm -o math.wasm math.wast
  • 如何在我的Linux主机上安装Raspberry Pi交叉编译器?(How to install the Raspberry Pi cross compiler on my Linux host machine?)
    问题 我正在尝试为在我的Ubuntu机器上工作的Raspberry Pi进行交叉编译。 在最初的尝试中,我使用的是arm-linux-gnueabi编译器,该编译器可在Ubuntu存储库中找到。 我得到了这个工作。 我能够建立所有依赖关系,并在cmake项目中使用交叉编译器。 但是,我相信我应该使用hf版本,因此我切换到了arm-linux-gnueabihf。 然后我意识到这对Raspberry Pi不起作用,因为它是armv6。 谷歌搜索后,我从GitHub找到了预构建的工具链。 我下载了工具链,但是我不太了解如何“安装”它。 我将文件提取到我的主目录中。 目录结构如下所示: /gcc-linearo-arm-linux-gnueabihf-raspbian /arm-linux-gnueabihf /bin (contains g++, gcc, etc) /lib (contains libstdc++ library) /bin (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...) /lib (gcc lib stuff) 如果将目录更改为INNER bin文件夹,则可以从终端编译测试程序,而不会出现任何问题。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux
  • 如何将C ++代码转换为C(How to convert C++ Code to C [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我有一些C ++代码。 在代码中,定义了许多类,它们的成员函数,构造函数,这些类的析构函数,很少的模板类和许多C ++东西。 现在,我需要将源代码转换为纯C代码。 我有以下问题: 有什么工具可以将C ++代码和头文件转换为C代码? 我是否需要完全重写代码(我将必须删除构造函数,析构函数,并将该代码移至一些init() , deinit()函数中;将类更改为结构,使现有成员函数作为这些新函数中的函数指针定义的结构,然后使用函数指针等调用这些函数。)? 如果我必须自己手动进行转换,那么从C ++转换为C时,我需要注意哪些特定于C ++的代码数据构造/语义? 回答1 确实有这样的工具,Comeau的C ++编译器。 。 它将生成您无法手动维护的C代码,但这没问题。 您将维护C ++代码,然后即时转换为C。 回答2 http://llvm.org/docs/FAQ.html#translatecxx 它可以处理一些代码,但是由于某些现代C ++约定尚未完全更新,因此无法实现更复杂的实现。 因此,请尝试经常编译代码,直到对允许的内容有所了解为止。 对于版本9.0.1,命令行中的用法语法如下: clang -c CPPtoC
  • 适用于Windows的LLVM C ++ IDE(LLVM C++ IDE for Windows)
    问题 是否有一些适用于Windows的C / C ++ IDE,就像现代Xcode一样,该IDE与LLVM编译器(和Clang C / C ++分析器)集成在一起。 我有Dev-Cpp(它使用了过时的GCC)和Code :: Blocks(带有一些GCC)。 但是GCC给了我非常神秘的错误信息。 我想从Clang前端获得一些更加用户友好的错误消息。 是的,Clang无法与复杂的C ++代码一起使用,但是Clang干线已经可以编译LLVM本身。 因此,我想知道是否有任何LLVM IDE正在开发中或处于beta版本中。 是的,我可以将Clang用作具有GCC兼容IDE的其他编译器。 但是,有没有与Clang集成的IDE? Clang具有不同的输出格式,因此IDE必须对其进行解析。 Clang可以提供源代码的IDE解析。 Clang具有分析选项,IDE必须支持该选项。 看一下,例如http://iosdevelopertips.com/xcode/static-code-analysis-clang-and-xcode-3-2.html Clang最想要的功能是智能自动补全功能,因此IDE只能建议语法正确的变体,例如,仅列出此struct,class的字段。 结果:(与答案合并): 带有CDT> = 8并带有https://code.google.com/archive/p
  • 如何安装 clang 预构建的二进制文件 ubuntu 12.04(How to install clang pre-built binaries ubuntu 12.04)
    问题 我对 linux 很陌生,不知道我需要在哪里放置 Clang 预构建的二进制文件 http://llvm.org/releases/download.html#3.3 。 我下载它,用鼠标解压,然后将 /bin 的路径添加到我的 $PATH,将 /lib 的路径添加到 $LD_LIBRARY_PATH,并将带有我的 /lib 路径的 *.conf 添加到 /etc/ld.so.conf.d . 我什至重新启动了我的笔记本。 ...但仍然无法使用 Code::Blocks GCC 构建我的简单程序(错误:/home/aadgrand/tmp/LLVM-3.3/final/llvm.src/lib/Support/Signals.cpp - 对 `dladdr' 的未定义引用)。 测试程序文本: #include <iostream> #include "llvm/IR/Module.h" #include "llvm/IR/LLVMContext.h" using namespace std; int main() { llvm::LLVMContext &c = llvm::getGlobalContext(); // error line cout << "Never printed" << endl; return 0; } 我还需要做什么? 也许我需要使用 *.sig
  • 【PostgreSQL 架构】PostgreSQL 11和即时编译查询
    PostgreSQL 11正在酝酿之中,即将发布。同时,使用您自己的应用程序对其进行测试是确保社区在零点发行之前捕获所有剩余错误的好方法。下一个PostgreSQL版本的重大变化之一是Andres Freund在查询执行器引擎上的工作成果。Andres已经在系统的这一部分上工作了一段时间,在下一发行版中,我们将看到执行引擎中的一个新组件:一个JIT表达式编译器!基准和TPC-H我喜欢在Citus Data进行工程工作以通过Citus扩展扩展PostgreSQL的一件事就是,我可以运行基准测试!基准测试是一个很好的工具,可以显示性能改进可带来哪些好处。当前,JIT表达式编译器在以下情况下效果最佳:该查询包含多个复杂的表达式,例如聚合。该查询读取了大量数据,但没有IO资源短缺。该查询非常复杂,以至于需要花费大量的JIT精力。通过主键代理ID获取某些信息的查询不太适合查看PostgreSQL中新的JIT基础结构所提供的改进。TPC-H基准测试第1季度查询可以很好地评估新执行程序堆栈的影响,因此我们在这里使用它。基准测试的规范可在137页的名为TPC Benchmark™H的PDF文档中找到。该规范中的每个查询都附带一个业务问题,因此请参阅第一季度定价摘要报告查询(Q1)此查询报告已开票,发货和退回的业务量。定价摘要报告查询提供了给定日期发货的所有订单项的摘要定价报告
  • 用CMake生成LLD VS 2019工程受虐记-1
    用CMake生成LLD VS 2019工程受虐记-1 今天尝试有CMake在LLVM上生成LLD的VC++工程,被虐了一整天。 先缩写关键操作: 最终确定下来在第一次调用Cmake后,并不会生成需要的lld executable。需要在这之前先手动修改llvm的CMakeLists.txt,把 option(LLVM_ENABLE_LLD “Use lld as C and C++ linker.” OFF) 改为 option(LLVM_ENABLE_LLD “Use lld as C and C++ linker.” ON) 再CMake。 然后会生成CMakeCache.txt。这里就会多出几个变量来,要把和LLD有关的都配置好,二度执行cmake,即可生成lld的工程。 以下是完整的受虐记录。 首先是看到http://lld.llvm.org/windows_support.html上对于building LLD的介绍,无比地清爽容易 Using Visual Studio IDE/MSBuild Check out LLVM and LLD from the LLVM SVN repository (or Git mirror), run cmake -G “Visual Studio 12” from VS command prompt, open LLVM.sln
  • iOS:内存优化思路
    前言:ARC 内存管理需要说说ARC:   ARC(Automatic Reference Counting):自动引用计数内存管理。ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。 ARC如何进行自动管理内存? LLVM编译器会在编译时在合适的地方为 OC 对象插入retain、release和autorelease代码来自动管理对象的内存。 计算机语言分为:编译型语言、直译式语言(脚本语言) 语言编译形式效率调试编译型语言C++ Objective C Swift Kotlin先通过编译器生成机器码机器码可以直接在 CPU 上执行执行效率较高调试周期长直译式语言JavaScript Python不需要经过编译,在执行时通过一个中间的解释器将代码解释为 CPU 可以执行的代码执行效率低编写调试方便 编译又分为前端编译和后端编译 1:前端编译 前端编译:主要是通过前端编译器Clang,生成中间码。Clang 主要处理: 预处理: 主要是宏替换(把宏嵌入到对应的位置),头文件的导入、注释删除词法分析: 这里把源文件中的代码转化为特殊的标记流,源码被分割成一个一个的字符和单词,在行尾Loc中都标记出了源码所在的对应源文件和具体行数,方便在报错时定位问题。语法分析: 这一步是把词法分析生成的标记流,解析成一个抽象语法树,同样地