如何使用 clang `-emit-llvm` 编译并保留“未使用的”C/C++ 结构体定义

问题描述 投票:0回答:1

背景

我正在研究 C/C++ 结构的内存布局检测。为此,我收集结构的红外代码并对其进行分析。

问题

但是,如果不使用结构体,clang 可能会忽略它并且不会生成任何 IR 代码。

struct A {
    void *ptr;
    int m_buf;
};

struct B {
    struct A a;
    int m_val;
};

int main() {
    // struct A a;
    // struct B b;
    return 0;
}

这是一个简单的,如果我在

main
中使用struct A&B,并用
clang -g -S -emit-llvm
编译它,它会生成如下IR代码:

%struct.A = type { i8*, i32 }
%struct.B = type { %struct.A, i32 }

但如果不使用,则会生成非LLVM IR。

我注意到这里之前的问题:如何使用 clang -emit-llvm 编译和保留“未使用的”C 声明。但它似乎处理函数声明。我更深入地研究了 clang 的源代码,发现使用的结构将通过像

Sema::RequireCompleteType
这样的函数。但我找不到忽略未使用的结构的地方。 我该如何解决这个问题?


添加结构体使用代码当然可以,但是当代码库变大时,添加使用代码可能会产生很大的开销。我想找到结构忽略代码并“将其关闭”。

clang llvm
1个回答
0
投票

目前无法在不使用的情况下保留结构/类定义。 clang 一开始就不会生成它们。

© www.soinside.com 2019 - 2024. All rights reserved.