Tag: clang

将OpenMP与clang一起使用

我在使用clang(3.6和3.8 ToT)编译OpenMP代码时遇到问题。 我关注了这篇博文http://blog.llvm.org/2015/05/openmp-support_22.html ,但问题是编译的程序只在一个线程上执行。 我正在使用ubuntu 15.04 x64,我安装了libgomp和libiopmp,并使用以下命令编译我的代码: clang test.c -o test -fopenmp -L/usr/lib/gcc/x86_64-linux-gnu/5.1.1 当我使用gcc时,一切正常: gcc test.c -o test -fopenmp 我也试过运行export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5.1.1:$LD_LIBRARY_PATH但它没有帮助。 ` 有什么建议?

__STDC_IEC_559__与现代C编译器的状态

C99添加了一个宏__STDC_IEC_559__ ,可用于测试编译器和标准库是否符合ISO / IEC / IEEE 60559(或IEEE 754)标准。 根据这个问题的答案 如何检查 – ieee-754-单精度-32位浮点表示大多数C编译器不设置预处理器宏__STDC_IEC_559__ 。 根据GCC的文档,它没有定义__STDC_IEC_559__ 。 我用GCC 4.9.2和Clang 3.6.0测试了这两个,使用glibc 2.21使用以下代码。 //test.c //#include int main(void) { #if defined ( __STDC_IEC_559__ ) //#if defined ( __GCC_IEC_559__ ) return 1; #else return 0; #endif } 然后 echo $? 这表明使用此代码__STDC_IEC_559__是使用GCC定义的,而不是使用Clang定义的。 然后我做了gcc -E ,它显示了包含文件stdc-predef.h 。 该文件定义__STDC_IEC_559__ 。 /* glibc’s intent is […]

什么构成“有效”C标识符?

在@Zaibis建议(和我自己的答案 有关宏名称的有效字符是什么? ,以及++(和其他unicode字符)在g ++不允许的标识符中 ))… clang允许很多“疯狂”的角色..虽然我一直在努力找到很多押韵或理由 – 至于为什么有些人被允许(🔴ϟツ⌘☁½),而其他人不是(▶︎∀★©)。 例如,以下所有编译A-OK( clang-700.1.76 ) #define 💩 ?: // OK (Pile of poo) #define ■ @end // OK (HALFWIDTH BLACK SQUARE) #define 🅺 @interface // OK (NEGATIVE SQUARED LATIN CAPITAL LETTER K) #define P @protocol // OK (FULLWIDTH LATIN CAPITAL LETTER P) 但以下都导致相同的编译器错误… Macro name must be an identifier. […]

C11 _Generic:如何处理字符串文字?

使用C11中的_Genericfunction,您如何处理字符串文字? 例如: #include #define foo(x) _Generic((x), char *: puts(x)) int main() { foo(“Hello, world!”); return 0; } 在clang上给出了这个错误: controlling expression type ‘char [14]’ not compatible with any generic association type 用char[]替换char *给了我 error: type ‘char []’ in generic association incomplete 获得这个编译的唯一方法(据我所知)是: 将字符串文字转换为适当的类型。 这很丑陋(在我看来)首先打败了_Generic 。 使用char[14]作为类型说明符。 你一定是在开玩笑吧…… 我的假设是,当传递给_Generic时,数组会衰减到指针,但显然不是。 那么,如何将_Generic与字符串文字一起使用? 那是唯一的两种选择吗? 我在Debian上使用clang 3.2。 不幸的是,它是我可以访问的唯一支持此function的编译器,因此我无法判断它是否是编译器错误。

GNU C本机向量:如何广播标量,如x86的_mm_set1_epi16

我如何编写一个可移植的GNU C内置向量版本,它不依赖于x86 set1内在函数? typedef uint16_t v8su __attribute__((vector_size(16))); v8su set1_u16_x86(uint16_t scalar) { return (v8su)_mm_set1_epi16(scalar); // cast needed for gcc } 当然必须有一个更好的方式 v8su set1_u16(uint16_t s) { return (v8su){s,s,s,s, s,s,s,s}; } 我不想写一个用于广播单个字节的AVX2版本! 对于你想要分配给一个变量而不是仅仅用作二元运算符的操作数(这与gcc一起使用,见下文)的情况, 即使只是gcc-only或clang-only这个部分的答案也会很有趣 。 如果我想使用广播标量作为二元运算符的一个操作数,则可以使用gcc( 如手册中所述 ),但不能使用clang: v8su vecdiv10(v8su v) { return v / 10; } // doesn’t compile with clang 有了clang,如果我只针对x86并且只使用本机向量语法来让编译器为我生成模数乘法逆常数和指令 ,我可以写: v8su vecdiv_set1(v8su v) { […]

在其他编译器中等同于MSVC的_countof?

是否有其他编译器提供的_countof内置等价物,尤其是GCC和Clang? 有没有非宏观forms?

在clang中,您如何使用每个函数的优化属性?

我正在尝试使用clang编译一个没有优化的特定函数,以防止某些与memset()相关的安全相关调用被优化掉。 根据可在此处找到的文档,存在一个允许这样的optnone属性。 此外, 这里可以找到一个例子 。 不幸的是,(至少在下面的clang版本上,在OS X 10.9.5上),这会导致编译器警告,如下例所示: $ clang –version Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix $ cat optnone.c #include __attribute__((optnone)) void* always_memset(void *b, int c, size_t len) { return memset(b, c, len); } $ clang -Wall -O3 -c -o optnone.o optnone.c optnone.c:3:16: warning: unknown attribute […]

融合乘法加法和默认舍入模式

使用GCC 5.3,以下代码包含-O3 -fma float mul_add(float a, float b, float c) { return a*b + c; } 生成以下程序集 vfmadd132ss %xmm1, %xmm2, %xmm0 ret 我注意到GCC已经在GCC 4.8中使用了-O3 。 Clang 3.7与-O3 -mfma产生 vmulss %xmm1, %xmm0, %xmm0 vaddss %xmm2, %xmm0, %xmm0 retq 但是Clang 3.7和-Ofast -mfma产生的代码与GCC相同, -O3 fast为-O3 fast 。 我很惊讶GCC使用-O3因为从这个答案来看 除非允许放宽的浮点模型,否则不允许编译器融合分离的加法和乘法。 这是因为FMA只有一个舍入,而ADD + MUL有两个舍入。 因此,编译器将通过融合违反严格的IEEE浮点行为。 但是,从这个链接说 无论FLT_EVAL_METHOD的值如何,任何浮点表达式都可以收缩,即,计算好像所有中间结果都具有无限范围和精度。 所以现在我感到困惑和担忧。 GCC是否有理由将-FMA与-O3一起使用? 融合是否违反了严格的IEEE浮点行为? […]

传入_Generic宏的不兼容的指针类型

以下代码生成2个警告,这些警告在问题标题中描述。 #include static void _print_f(float *f){printf(“float : %f\n”, *f);} static void _print_i(int *i) {printf(“int : %d\n”, *i);} #define print(num) _Generic((num), \ int* : _print_i(num), \ float* : _print_f(num)) int main(void) { print((&(int){10})); print((&(float){10.f})); return 0; } OUTPUT: int : 10 float : 10.000000 我知道,这个宏可以写成如下: #define print(num) _Generic((num), \ int* : _print_i, \ float* : _print_f)(num) […]