Tag: clang

Clang – 将C头编译为LLVM IR / bitcode

假设我有以下简单的C头文件: // foo1.h typedef int foo; typedef struct { foo a; char const* b; } bar; bar baz(foo*, bar*, …); 我的目标是获取此文件,并生成一个如下所示的LLVM模块 : %struct.bar = type { i32, i8* } declare { i32, i8* } @baz(i32*, %struct.bar*, …) 换句话说,将带有声明的C .h文件转换为等效的LLVM IR,包括类型解析,宏扩展等。 通过Clang传递它来生成LLVM IR会产生一个空模块(因为实际上没有使用任何定义): $ clang -cc1 -S -emit-llvm foo1.h -o – ; ModuleID = ‘foo1.h’ target […]

使用标记为__unused的参数时发出警告

使用-Wunused参数标志,可以对未使用的参数强制__unused,作为编译器优化。 以下代码会导致两个警告: #include int main(int argc, char **argv) { printf(“hello world\n”); return 0; } 通过添加__unused未使用的参数来修复这些警告。 #include int main(int __unused argc, char __unused **argv) { printf(“hello world\n”); return 0; } 当您使用标记为__unused的参数时,clang 4.1不会发出警告或错误。 #include int main(int __unused argc, char __unused **argv) { printf(“hello world. there are %d args\n”, argc); return 0; } 使用__attribute__((unused))表现出相同的行为。 int main(int __attribute__((unused)) argc, […]

这种工会的使用是否严格符合?

鉴于代码: struct s1 {unsigned short x;}; struct s2 {unsigned short x;}; union s1s2 { struct s1 v1; struct s2 v2; }; static int read_s1x(struct s1 *p) { return p->x; } static void write_s2x(struct s2 *p, int v) { p->x=v;} int test(union s1s2 *p1, union s1s2 *p2, union s1s2 *p3) { if (read_s1x(&p1->v1)) { unsigned short […]

设置llvm :: ConstantInt的值

我正在玩LLVM。 我想过在中间代码中改变常量的值。 但是,对于类llvm :: ConstantInt ,我没有看到setvalue函数。 任何想法如何修改IR代码中常量的值?

有什么不同? clang ++ | clang -std = c ++ 11

我错误地使用了这个在链接步骤失败的命令: $ clang -std=c++11 -stdlib=libc++ myInputFile.cpp 任何人都可以解释为什么clang提供了C ++语言选项,以及为什么它无法链接? 为什么选项-x c++或-std=c++11完成与clang++相同的操作? 谢谢!

在每个源文件中包含一个头文件

假设您有100个源文件(.c或.cpp)文件,并且您希望在每个文件中包含一些定义,函数/变量声明。 通常在C / C ++中,您使用头文件来实现此目的。 但在这种情况下,您需要在每个源文件中放入#include“header.h”。 现在我的问题是,有没有办法为所有文件包含一个标题而不在每个文件中放入#include“header.h”,因为编写#include“header.h”为100s是非常烦人的源文件。

针对clang的LTO可以跨C和C ++方法进行优化

如果链接时优化(LTO)与clang一起使用 ,是否可以跨C和C ++语言边界优化代码? 例如,C函数可以内联到C ++调用者中,反之亦然吗?

typedef with restrict关键字

我定义了像这样的对齐浮点数 typedef __attribute((aligned(64))) float aligned_float; 然后我用这样的restrict关键字定义对齐的浮点数 typedef aligned_float * restrict aligned_floatptr; 这与我期望的一样。 但由于我几乎总是想要这两个在一起,所以我尝试将typedef放在一行中 typedef __attribute((aligned(64))) float * restrict aligned_floatptr2 但是,这不起作用。 仍然可以识别restrict关键字,但不会对齐。 然而,编译器没有给我任何警告。 我只是通过查看组件才意识到对齐不起作用。 为什么组合定义不起作用,为什么我不收到警告? 你可以在这里看到Clang和GCC的组件。 我想这样做的原因是我有这样的代码 static void kernel(float * restrict a, float * restrict b, float * restrict c, int n) { a = __builtin_assume_aligned(a, 64); b = __builtin_assume_aligned(b, 64); c = __builtin_assume_aligned(c, 64); […]

优雅而安全的方法来确定架构是32位还是64位

正如标题所说,有没有任何优雅和安全的方法来确定架构是32位还是64位。 通过优雅,您可以想到精确,正确,简短,干净和智能的方式。 安全,从标准,C89 / C99和操作系统独立性的角度考虑安全。

Clang编译器的C enum的数据类型是什么?

我发布了其他问题: 我应该使用什么类型的C enum的二进制表示? ,通过答案,我必须知道我的编译器的枚举数据类型。 Clang编译器上C enum的数据类型是什么?