Tag: clang

来自stdin与clang的自动完成

我已经在Emacs中设置了一个自动完成环境,使用clang 2.8作为解析器。 它运行良好,但依赖于在完成之前将当前编辑的缓冲区保存到文件。 这很慢,所以我试图让clang解析一个通过stdin给它的文件而不是运气到目前为止。 解析文件时命令行I feed clang如下: clang -cc1 -fsyntax-only -Iinclude/ -code-completion-at foo.cpp:10:20 foo.cpp 这很好用。 但尝试从stdin读取失败。 我试过这个: cat foo.cpp | clang -xc++ -cc1 -fsyntax-only -Iinclude/ -code-completion-at -:10:20 – 但这使得clang在没有完成任何完成的情况下终止并打印出警告: clang: warning: argument unused during compilation: ‘-cc1’ clang: warning: argument unused during compilation: ‘-code-completion-at’ clang: warning: argument unused during compilation: ‘-:10:20’ 有任何想法吗?

从LLVM bitcode编译对象时无法链接到静态库。

我正在开发一个LLVM编译器传递。 我通过以下方式运行传递: 编译为LLVM bitcode clang foo.c -emit-llvm -c -o foo.bc 通过opt运行foo.bc(没有此步骤仍会出现错误) 编译回目标文件 clang -c -o foo.o foo.bc 现在foo.o可能是静态库的一部分。 ar rc libfoo.a foo.o 当以这种方式编译所有我的c文件时,我无法链接到libfoo.a。 clang libfoo.a linkme.o -o linkme linkme.o:linkme.bc:function main: error: undefined reference to ‘foo’ clang: error: linker command failed with exit code 1 (use -v to see invocation) 源文件: foo.c的: int foo(int a) { […]

ISO 8601:2004中的C预处理器__TIMESTAMP__

如何在ISO 8601:2004中更换__TIMESTAMP__ ? __TIMESTAMP__ Sat Jul 6 02:50:06 2013 VS __TIMESTAMP_ISO__ 2013-07-06T00:50:06Z

C中的可移植嵌套函数

是否可以使用嵌套函数/块编写可移植C代码? 我知道gcc只支持嵌套函数作为非标准扩展,而clang只支持块 – 但是有没有办法编写可以使用标准C和MACROS进行编译的代码? 如果不可能 – 最好的工作是什么? 举个例子,如何实现一个带参数的以下类型的可移植版本? 海湾合作委员会的简单例子: int main(int argc, char*[] argv) { char reverse = 0; int cmp_func(const void *a, const void *b) { const int* aa = (const int)a; const int* bb = (const int)b; return (reverse) ? aa – bb : bb – aa; } int list[8] = {1,2,3,4,5,20,100,200}; qsort(list, […]

自定义支持__attribute __((格式))

GCC和Clang都支持对变量参数函数(如printf进行编译时检查。 这些编译器接受如下语法: extern void dprintf(int dlevel, const char *format, …) __attribute__((format(printf, 2, 3))); /* 2=format 3=params */ 在OSX上,Cocoa框架也对NSString使用了这个扩展: #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A))) 在我们公司,我们有一个自定义C ++框架,其中包含一些类,如BaseString所有类都派生自BaseObject 。 在BaseString有一些类似于sprintf变量参数方法,但有一些扩展。 例如, “%S”需要类型为BaseString*的参数,而”%@”需要BaseObject*参数。 我想对我们项目中的参数执行编译时检查,但由于扩展, __attribute__((format(printf)))给出很多误报警告。 有没有办法为两个编译器之一定制__attribute__((format))的支持? 如果这需要编译器源的补丁,它是否可以在合理的时间内完成? 或者,是否有其他类似工具的lint可以执行检查?

生成多个输出文件时无法指定-o

我有一个关于make文件使用gcc的问题,下面是我在makefile中的代码。 我在生成多个输出文件错误时无法指定-o,但我只是看不出问题出在哪里。 有人可以指出我的错误吗? 谢谢! BASE_FILES=bwtsearch.c bwtsearch.h bwttext.c bwttext.h chartable.c chartable.h common.h occtable.c occtable.h plset.c plset.h strbuf.c strbuf.h BASE_ENCODER_FILES=bwtencoder.h bwtencoder.c BWTSEARCH_FILES=${BASE_FILES} main_bwtsearch.c BENCODE_FILES=${BASE_ENCODER_FILES} main_bencode.c PSEARCH_FILES=${BASE_FILES} main_psearch.c PSEARCH_NL_FILES=${BASE_FILES} main_psearch_nl.c PENCODE_FILES=${BASE_ENCODER_FILES} main_pencode.c PENCODE_NL_FILES=${BASE_ENCODER_FILES} main_pencode_nl.c DEBUG_FILES=${BASE_FILES} main_debug.c all: bwtsearch psearch psearch_nl pencode pencode_nl bencode clean: rm psearch psearch_nl bwtsearch pencode pencode_nl bencode bwt_debug bwtsearch: ${BWTSEARCH_FILES} gcc -o bwtsearch ${BWTSEARCH_FILES} […]

为什么编译器不再使用严格的别名来优化此UB

谷歌严格别名的第一个结果之一就是这篇文章http://dbp-consulting.com/tutorials/StrictAliasing.html 我注意到的一件有趣的事情是: http : //goo.gl/lPtIa5 uint32_t swaphalves(uint32_t a) { uint32_t acopy = a; uint16_t* ptr = (uint16_t*)&acopy; uint16_t tmp = ptr[0]; ptr[0] = ptr[1]; ptr[1] = tmp; return acopy; } 被编译为 swaphalves(unsigned int): mov eax, edi ret 由GCC 4.4.7。 任何比这更新的编译器(文章中提到的4.4所以文章没有错)都没有实现该函数,因为它可以使用严格别名。 这是什么原因? 它实际上是GCC中的错误还是GCC决定放弃它,因为许多行代码是以产生UB的方式编写的,或者它只是一个持续多年的编译器回归…而Clang也没有优化它。

如何在预处理器中检测X32 ABI或环境?

X32是使用32位指针的amd64 / x86_64 CPU的ABI。 我们的想法是将较大的x86_64寄存器组与32位指针产生的较小内存和高速缓存占用空间相结合。 它提供高达约40%的加速。 有关详细信息并将其设置为chroot环境,请参阅Stack Overflow上的x86,x32和x64体系结构与Debian X32 Ports wiki页面之间的区别 。 我们在环境下有一个来自Debian维护者的错误报告。 报告是adcq是非法指令。 内联汇编是基于预处理器宏激活的,因此我们没有正确检测X32(或者更正确,直到现在都没有)。 对于预处理器宏,最明显的选择(对我来说)就像__X32__ ,但是没有提供。 基于Clang的补丁和Debian的建议 ,看起来可以使用__ILP32__ 。 但是我想要一个更规范的答案,因为_ILP32和__code_model_small__看起来也很有趣。 (我知道SSE2的问题,编译器支持它,但操作系统没有)。 在使用Clang和GCC时,可以使用哪些预处理器宏可靠地检测X32 ABI和环境? 要清楚,我现在不是要修改代码。 我只想知道可以在完全修复中使用的宏。 # cpp -dM < /dev/null | sort #define __amd64 1 #define __amd64__ 1 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_CONSUME 1 #define __ATOMIC_HLE_ACQUIRE 65536 #define __ATOMIC_HLE_RELEASE 131072 #define […]

无法使用clang编译和链接程序

我最近在Ubuntu系统上编译了Clang 2.9(来自这里 )。 我在编译和链接一个简单的程序时遇到了麻烦。 有谁知道如何解决这一问题? 这是我看到的输出: a@ubuntu:~/Desktop$ clang add.c /usr/bin/ld: 1: Syntax error: word unexpected (expecting “)”) clang: error: linker command failed with exit code 2 (use -v to see invocation) uname -a输出 Linux ubuntu 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux gcc -v输出: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/lto-wrapper […]

C编译器中的列主要数组存储

是否有任何C编译器具有扩展以按列主要顺序存储数组而不是标准行主要顺序?