小编Pet*_*pin的帖子

创建和使用LLVM bitcode库

我有一个C++项目,它使用我也写过的C++库.我正在使用clang ++ 3.3来构建一切.库中的每个文件都编译为

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc
Run Code Online (Sandbox Code Playgroud)

然后我使用llvm-link将所有库*.bc文件组合成一个像这样的位代码文件

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc
Run Code Online (Sandbox Code Playgroud)

我将其概念化为类似于创建目标文件的存档,但我不认为这是基于事物的行为方式.

然后我使用与上面相似的命令编译项目的源文件.然后我使用llvm-link(再次)将这些以及库位代码文件与这样的单个位代码文件组合在一起

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc
Run Code Online (Sandbox Code Playgroud)

接下来,我将app.bc1编译为本机对象文件

llc -filetype=obj app.bc1 -o app.o
Run Code Online (Sandbox Code Playgroud)

最后我再次使用clang ++链接这个本机对象文件(和我需要的其他本机库,比如C++标准库等)

clang++ app.o -o app
Run Code Online (Sandbox Code Playgroud)

然而,似乎正在发生的事情是,当我链接应用程序的位代码时,MyLibrary.bc的全部内容似乎都包含在结果中.因此,最终链接需要解析我实际上没有使用的库组件所做的引用.

我想要做的是从MyLibrary.bc中提取我的应用程序所需的位代码文件.我看到有一个llvm-ar程序,但在阅读它时,我不会觉得它会有所帮助.我猜我可以将库与llvm-ar结合使用而不是llvm-link,但我无法弄明白.我希望我所需要的只是一点推动:)

llvm clang

10
推荐指数
1
解决办法
6388
查看次数

如何使用ANTLR4构建AST?

我有一个ANTLR3语法,可以构建一个抽象语法树.我正在寻求升级到ANTLR4.但是,似乎ANTLR4只构建解析树而不是抽象语法树.例如,output=AST不再识别该选项.此外,"The Definitive ANTLR4 reference"的文本中既没有出现"AST"也没有出现"抽象语法".

我想知道我是否遗漏了什么.

我的应用程序目前知道如何爬行ANTLR3生成的AST.更改它以处理解析树并非不可能,但这将是一项工作.在我开始走这条路之前,我想确定它是必要的.

abstract-syntax-tree antlr4

8
推荐指数
1
解决办法
4127
查看次数

使用Scala反射查找大多数派生的运行时类型

我正在尝试使用Scala 2.10反射来查找方法参数的派生类型.例如,考虑这个程序:

import reflect.runtime.universe._

object ReflectionTest {

  def checkType[A : TypeTag](item: A) {
    println("typeOf[A]: " + typeOf[A])
  }

  def main(args: Array[String]) {
    val a = Array(1, "Hello")
    for (item <- a) checkType(item)
  }
}
Run Code Online (Sandbox Code Playgroud)

这里a有类型Array [Any]所以每个被发送的项目checkType都有Any类型.结果,checkType产出

typeOf[A]: Any
typeOf[A]: Any
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为TypeTag是由编译器在调用时生成的(其中所有知道类型的都是它Any).但是,我想要确定每个项目的实际类型.我想输出一些东西

Int
String
Run Code Online (Sandbox Code Playgroud)

我在这里查看了文档

http://docs.scala-lang.org/overviews/reflection/overview.html

但是样本似乎并没有涵盖这种情况,我发现环境,宇宙和镜子的讨论难以渗透.似乎我想要做的事情应该相当简单,但也许我正在接近它完全错误.

reflection scala

3
推荐指数
1
解决办法
599
查看次数

我在 Mac 上构建简单的 D 程序时遇到令人困惑的链接错误

我是 D 编程新手。我在 M1 处理器上使用 macOS Sonoma。我系统上的 clang 版本是 15.0.0。我安装了最新版本的 DMD (2.106)。我创建了这个程序:

import std.stdio;

int main()
{
    int a = 0;
    a++;

    // Display the result.
    writefln("a = %d", a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用命令编译它dmd app.d,其中“app.d”是包含上述代码的文件的名称。这是我收到的消息:

ld: multiple errors: symbol count from symbol table and dynamic symbol table differ in '/Users/peter/BOK/D/source/app.o' in '/Users/peter/BOK/D/source/app.o'; address=0x0 points to section(2) with no content in '/Library/D/dmd/lib/libphobos2.a[3228](config_a94_4c3.o)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

当我将 -v 选项添加到链接器命令行时,我收到大量这种形式的消息: …

macos d

3
推荐指数
1
解决办法
157
查看次数

标签 统计

abstract-syntax-tree ×1

antlr4 ×1

clang ×1

d ×1

llvm ×1

macos ×1

reflection ×1

scala ×1