java代码修改触发编译_gcc -O0仍然优化了“未使用”的代码 . 是否有一个编译标志来改变它?...
当我在this question中提出时,gcc正在移除(是的,使用 -O0 )一行代码 _mm_div_ss(s1, s2); ,大概是因为结果未保存 . 但是,这应该触发浮点异常并引发SIGFPE,如果删除调用则不会发生这种情况 .
Question :是否有一个标志或多个标志传递给gcc,以便代码按原样编译?我正在考虑像 fno-remove-unused 这样的东西,但是我支持使用gcc属性/ pragma代替吗?
我尝试过的事情:
$ gcc --help=optimizers | grep -i remove
没有结果 .
$ gcc --help=optimizers | grep -i unused
没有结果 .
并明确禁用所有死代码/消除标志 - 请注意,没有关于未使用代码的警告:
$ gcc -O0 -msse2 -Wall -Wextra -pedantic -Winline \
-fno-dce -fno-dse -fno-tree-dce \
-fno-tree-dse -fno-tree-fre -fno-compare-elim -fno-gcse \
-fno-gcse-after-reload -fno-gcse-las -fno-rerun-cse-after-loop \
-fno-tree-builtin-call-dce -fno-tree-cselim a.c
a.c: In function ‘main’:
a.c:25:5: warning: ISO C90 forbids mixed declarations and code [-Wpedantic]
__m128 s1, s2;
^
$
来源计划
#include
#include
#include
#include
static void sigaction_sfpe(int signal, siginfo_t *si, void *arg)
{
printf("%d,%d,%d\n", signal, si!=NULL?1:0, arg!=NULL?1:0);
printf("inside SIGFPE handler\nexit now.\n");
exit(1);
}
int main()
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = sigaction_sfpe;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGFPE, &sa, NULL);
_mm_setcsr(0x00001D80);
__m128 s1, s2;
s1 = _mm_set_ps(1.0, 1.0, 1.0, 1.0);
s2 = _mm_set_ps(0.0, 0.0, 0.0, 0.0);
_mm_div_ss(s1, s2);
printf("done (no error).\n");
return 0;
}
编译上面的程序给出了
$ ./a.out
done (no error).
换线
_mm_div_ss(s1, s2);
至
s2 = _mm_div_ss(s1, s2); // add "s2 = "
产生预期的结果:
$ ./a.out
inside SIGFPE handler
编辑更多细节 .
这似乎与 _mm_div_ss definition上的 __always_inline__ 属性有关 .
$ cat t.c
int
div(int b)
{
return 1/b;
}
int main()
{
div(0);
return 0;
}
$ gcc -O0 -Wall -Wextra -pedantic -Winline t.c -o t.out
$
(没有警告或错误)
$ ./t.out
Floating point exception
$
vs下面(功能属性除外)
$ cat t.c
__inline int __attribute__((__always_inline__))
div(int b)
{
return 1/b;
}
int main()
{
div(0);
return 0;
}
$ gcc -O0 -Wall -Wextra -pedantic -Winline t.c -o t.out
$
(没有警告或错误)
$ ./t.out
$
添加函数属性 __warn_unused_result__ 至少会给出一条有用的消息:
$ gcc -O0 -Wall -Wextra -pedantic -Winline t.c -o t.out
t.c: In function ‘main’:
t.c:9:5: warning: ignoring return value of ‘div’, declared with attribute warn_unused_result [-Wunused-result]
div(0);
^
编辑:
关于gcc mailing list的一些讨论 . 最终,我认为一切都按预期工作 .
java代码修改触发编译_gcc -O0仍然优化了“未使用”的代码 . 是否有一个编译标志来改变它?...相关推荐
- java反射 修改静态方法的值 setAccessible
转载自 java反射 修改静态方法的值 setAccessible 这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目 static void change(String str){str=& ...
- 运行java提示未签名_java – JNLP:在签名代码中加载未签名的代码
我们在克服Java webstart的混合代码错误时遇到了困难.总之,我们有我们的主要JNLP文件,我们已经签署了它直接加载的所有代码.我们已将all-permissions选项添加到主JNLP中.它 ...
- 遗传算法_粒子群算法优化支持向量机分类预测-附代码
遗传算法/粒子群算法优化支持向量机分类预测-附代码 文章目录 遗传算法/粒子群算法优化支持向量机分类预测-附代码 1. 支持向量机简介与参数优化的原理 1.1 支持向量机SVM简介 1.2 优化参数的 ...
- TVM yolov3优化代码修改(编译运行OK)
TVM yolov3优化代码修改(编译运行OK) yolov3_quantize_sample.py 附https://github.com/makihiro/tvm_yolov3_sample代码: ...
- 【Java】《面向对象程序设计——Java语言》Castle代码修改整理
前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...
- java中static代码块_static怎样在java中修改代码块?
代码是我们每个学编程的小伙伴都接触的内容,在代码块的修改上有很多方法,那么在java中又需要使用哪种方式来对代码块进行变动呢?哦们最近在学关键字的版块,其中有一个static用来修饰代码块的效果非常不 ...
- 编译基于Chrome代码修改的Brave浏览器
0x1.概述 最近由于工作需要,对Chrome浏览器的Android版本进行编译学习,在网上找了一下,发现有一个基于Chrome开源基础上做二次修改的版本,名叫Brave,GIT仓库代码,主打隐私安全 ...
- maven自动编译,解决你每次代码修改需要重新编译的繁琐
maven结构的项目,我们在每次修改代码后都会需要手动编译,下面命令可以解决此问题,只要代码修改,会自动帮你编译. 进入项目目录执行:mvn -U eclipse:clean eclipse:ecli ...
- QQ音乐Android端120万行代码,编译耗时是怎样优化的,凭借这份《数据结构与算法》核心文档
在本文的后续内容中,将介绍几个重点模块的实现. 5. 核心原理 代码编译 (1)获取改动文件并进行编译 首先需要考虑的问题是,如何识别出用户改动了哪些文件? 我们的做法是,在每次编译成功后,收集所有工 ...
最新文章
- 2022-2028年中国橡胶手套行业市场研究及前瞻分析报告
- 关于Activity class {package/class} does not exist
- 协同过滤:基于用户的协同过滤itemCF
- 1143 Lowest Common Ancestor (30 分)【难度: 中 / 知识点: 最低公共祖先 未完成】
- jenkins更改默认端口
- 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
- docker-compose(入门,与docker的区别)
- WordPress网站迁移数据最佳解决方案
- mysql 并行复制原理_MySQL 5.7 并行复制实现原理与调优
- java 视频转码工具类_JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)...
- ubuntu安装redis_在Ubuntu上安装Redis
- C语言中强制转换问题
- docker privileged作用_docker容器性能监控cAdvisor+influxDB+grafana监控系统安装部署
- 如何获取Android应用签名?
- Crout分解法 | matlab
- mac datagrip如何建立本地链接
- 三个蛤蜊三块肉才能称得上“老板”
- firnbsp;提交的版本的iphone4amp;nbs…
- 在线词云加载慢,有水印?作为程序员,教你如何使用Java,Python和JS生成词云!
- 新神奇传说补丁_如何在神奇宝贝Go中捕捉传说中的神奇宝贝
热门文章
- Linux使用jstat命令查看jvm的GC情况
- [JS][jQuery]清空元素html()、innerHTML= 与 empty()的区别 、remove()区别
- oracle中保留2位小数的写法
- mysql Error 1045(28000)
- as3:sprite作为容器使用时,最好不要指定width,height
- (转)解读NTFS(一)
- java ee 值范围_JAVAEE之内置对象和属性范围
- Linux Mysql 安装方法
- Eclipse中Copy Qualified Name复制类全名解决办法
- c 语言bool 类型数据_C ++中的bool数据类型