【问题标题】:Clang: Do not optimize a specific functionClang:不优化特定功能
【发布时间】:2016-04-26 11:09:39
【问题描述】:

很长一段时间我都使用gcc 来编译C 代码。有时我不得不使用optimize("O0") 属性来禁用特定功能的优化。现在我喜欢用clang 来做这件事。

假设以下代码:

#include <stdio.h>

void __attribute__((optimize("O0"))) blabla(void) {
}

int main(void) {
    blabla();
    return 0;
}

如果我用clang 编译它,我会得到这个错误:

test2.c:3:21: warning: unknown attribute 'optimize' ignored [-Wattributes]
void __attribute__((optimize("O0"))) blabla(void) {
                    ^
1 warning generated.

然后我使用谷歌(以及)stackoverflow 来找出clang 所需的属性,因为其中许多属性不在标准中(据我所知)。

我找到了这个帖子: In clang, how do you use per-function optimization attributes?

如果我尝试属性 optimize("0") 我得到这个错误:

test2.c:3:21: warning: unknown attribute 'optimize' ignored [-Wattributes]
void __attribute__((optimize("0"))) blabla(void) {
                    ^
1 warning generated.

如果我尝试属性 optnone 我得到这个错误:

test2.c:3:21: warning: unknown attribute 'optnone' ignored [-Wattributes]
void __attribute__((optnone)) blabla(void) {
                    ^
1 warning generated.

我也尝试将属性移到函数名之后,但不起作用(出于某种原因有关于 GCC 的警告?!):

test2.c:3:34: warning: GCC does not allow optnone attribute in this position on a function definition [-Wgcc-compat]
void blabla(void) __attribute__((optnone)) {
                                 ^
test2.c:3:34: warning: unknown attribute 'optnone' ignored [-Wattributes]
2 warnings generated.

使用以下代码进行另一个测试:

#include <stdio.h>

[[clang::optnone]]
void blabla(void) {
}

int main(void) {
    blabla();
    return 0;
}

它产生:

user@ubuntu:/tmp/optxx$ clang test2.c
test2.c:3:1: error: expected identifier or '('
[[clang::optnone]]
^
test2.c:3:2: error: expected expression
[[clang::optnone]]
 ^
test2.c:8:5: warning: implicit declaration of function 'blabla' is invalid in C99 [-Wimplicit-function-declaration]
    blabla();
    ^
1 warning and 2 errors generated.

可能我做错了什么,但我看不到什么。

-编辑-

clang版本:

user@ubuntu:/tmp/optxx$ clang -v
Ubuntu clang version 3.3-16ubuntu1 (branches/release_33) (based on LLVM 3.3)
Target: x86_64-pc-linux-gnu
Thread model: posix

【问题讨论】:

  • 这应该可以。你用的是哪个版本的clang? clang.llvm.org/docs/…
  • 几乎与this问题重复
  • 我相信应该是void blabla(void) __attribute__((optnone)) {
  • @Alex,不太确定; clang 文档到处使用type __attribute__((stuff)) name
  • clang.llvm.org/docs/… 你是否使用 -std=gnu 可能只有在你将代码声明为 gnu 代码时才启用这些属性?

标签: c gcc optimization clang


【解决方案1】:

尝试以下 clang 风格的属性规范:

[[clang::optnone]]
void blabla(void);

编辑:Clang 3.3 已经过时了。使用更新的版本,您原来的 ((optnone)) 代码就可以使用。

【讨论】:

  • 好的,我会尝试更新 clang :) 感谢您的提示。
  • 不幸的是升级ubuntu(和clang)需要很多时间,但我会尽快测试它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多