gnu cc扩展和ABI
gnc cc扩展标准c的语法,非常强大!!!详情请见:
http://uw714doc.sco.com/cgi-bin/info2html?%28gcc.info%29C%2520Extensions&lang=en
http://tigcc.ticalc.org/doc/gnuexts.html#SEC104
https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/C-Extensions.html#C-Extensions
ABI是application binary interface的缩写,规定了struct布局,函数调用规则,数据大小等。
非常值得研究。
比如:x86-64下,rbx,rbp,r12-r15是called saved registers。
参考文献:http://www.x86-64.org/documentation/abi.pdf
people.freebsd.org/~obrien/amd64-elf-abi.pdf
#define my_min(x, y) ({const typeof(x) __x = x; \
const typeof(y) __y = y; \
(void) (&__x == &__y); \
__x < __y ? __x : __y;})
struct Str
{
int a;
char b;
short c;
} __attribute__((packed));
#define ERR_PRINTF(fmt, args...) {\
]; \
snprintf(msg, sizeof(msg), "%s:%d "fmt"\n", __FUNCTION__, __LINE__, ##args);\
printf("%s", msg); \
}
#define ERR_PRINTF2(fmt, ...) \
printf("%s:%d "fmt"\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define likely(x) __builtin_expect((x), 1)
#define unlikely(x) __builtin_expect((x), 0)
__attribute__ ((noinline)) bool CAS_64b(uint64_t* ptr, uint32_t* oldv, uint32_t* newv)
{
bool ret = false;
__asm__ __volatile__ (
"pushl %%ebx;"
"movl %4, %%ebx;"
"lock cmpxchg8b %1;\n"
"sete %0;\n"
"popl %%ebx;\n"
:"=m"(ret),"+m"(*(uint64_t volatile*)(ptr))
:]), ]), ]), ])
:"memory");
return ret;
}
//#if defined(__x86_64__)
//#define CAS(ptr, oldv, newv) __sync_bool_compare_and_swap((uint64_t*)(ptr), *(uint64_t*)(&oldv), *(uint64_t*)(&newv))
//#else
#define CAS(ptr, oldv, newv) CAS_64b((uint64_t*)(ptr), (uint32_t*)(&oldv), (uint32_t*)(&newv))
//#endif
struct A
{
int a;
int b;
};
void test_CAS()
{
, };
, };
struct A sc = sa;
if(CAS(&sc, sa, sb))
printf("success, %d %d\n", sb.a, sb.b) ;
else
printf("fail, %d %d\n", sb.a, sb.b);
}
void f_unlikely()
{
printf("go unlikely\n");
}
void f_likely()
{
printf("go likely\n");
}
void test_aligned(char* p)
{
)>>)<<);
*(()) = ;
}
void test_likely(int x)
{
if(unlikely(x))
f_unlikely();
else
f_likely();
}
void test_return_addr()
{
);
printf("address \t %p\n", p);
}
void test_frame_addr()
{
);
printf("address \t %p\n", p);
}
int main()
{
//typeof
//statement expression
, );
printf("%d\n", c);
//packed
printf("sizeof(Str) = %u\n", (uint32_t)sizeof(Str));
//##
ERR_PRINTF();
ERR_PRINTF("test2");
ERR_PRINTF2();
//printf("%s:%d ""test2""\n", __FUNCTION__, 80, ); // the , still exists
ERR_PRINTF2("test2");
//__builtin_expect
test_likely();
//__builtin_return_address
test_return_addr();
//__builtin_frame_address
test_frame_addr();
//test aligned
] = {};
test_aligned(pp);
//test CAS
test_CAS();
)
sleep();
;
}
执行结果:
[ ~/code/test_sighup]$ ./test_gcc_ex
1
sizeof(Str) = 7
main:120 1 test
main:121 test2
main:123 1 test
main:125 test2
go unlikely
address 0x804882b
address 0xffb33aa8
success, 3 4
objdump -DC ./test_gcc_ex
00000000004006a0 <test_likely(int)>:
4006a0: 85 ff test %edi,%edi
4006a2: 75 05 jne 4006a9 <test_likely(int)+0x9>
4006a4: e9 d7 ff ff ff jmpq 400680 <f_likely()>
4006a9: e9 e2 ff ff ff jmpq 400690 <f_unlikely()>
4006ae: 66 90 xchg %ax,%ax
参考代码:
http://blog.csdn.net/cugxueyu/article/details/1955372
gnu cc扩展和ABI的更多相关文章
- GNU C 扩展(转)
GNU CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.这里对支持支持 GNU 扩展的 C 语言成为 GN ...
- Linux 内核使用的 GNU C 扩展
gcc核心扩展linuxforum(转)=========================== Linux 内核使用的 GNU C 扩展 =========================== GNC ...
- GNU C 扩展之__attribute__ 机制简介
在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...
- GNU GCC 扩展属性
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html constructor destructor constructor (prior ...
- 关于GNU规范的语法扩展
GNU 是一款能用于构建类 Unix 操作系统的计算机软件合集,由自由软件之父 Richard Stallman 开创,于 1983 年 9 月 27 日对外发布.GNU 完全由自由软件(free s ...
- 了解甚少的GNU C的__attribute__ 机制
平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的 差距---内功.熟练码农和码神的最大区别估计就是内功是否深厚了.在自我反思的过程中,也要逐渐的积累一些 ...
- GNU C编译器的gnu11和c11
国际标准组织发布c11后,gnu为自己的编译器发布两种标准gnu11和c11 gnu11:带gnu c扩展的c11标准,如果你的代码包含了typeof,__attribute__等等gnu的扩展,就必 ...
- 【转载】 GNU GCC 选项说明
GCC 1 Section: GNU Tools (1) Updated: 2003/12/05 Sponsor: GCC Casino Winning Content NAME gcc,g++-GN ...
- gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)
总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...
随机推荐
- webstrom开发微信小程序说明
在操作之前,需要对webstrom做一些设置,如下 如果未安装node.js的朋友,请到如下地址 https://nodejs.org/en/ 安装(相信大家都是会的),如果安装完了之后,就使用如下的 ...
- JVM运行数据区
1.java虚拟机在运行的时候会把内存分为以下几个区域,如图:
- SQLServer中使用索引视图(物化视图)
物化视图:以前用的普通的视图,普通视图就是一段逻辑语句,对性能没有任何的提升,也不能创建索引,而物化视图会把视图里查询出来的数据在数据库上建立快照,它和物理表一样,可以创建 索引,主键约束等等,性能会 ...
- MyEclipse 安装SVN插件方法及插件下载地址
直接解压法 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240下载SVN插件:site-1.x.x. ...
- UI实时预览最佳实践(转)
UI实时预览最佳实践 概要:Android中实时预览UI和编写UI的各种技巧.本文的例子都可以在结尾处的示例代码中看到并下载.如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以 ...
- 初学 Canvas <第一篇-基础篇>
本文摘自:兴趣部落大神(为你一生画眉)-讲一讲canvas究竟是个啥? HTML5 的标准已经出来好久了,但是似乎其中的 Canvas 现在并没有在太多的地方用到.一个很重要的原因是,Canvas 的 ...
- 在Ubuntu上安装使用Systemtap
因为最近开始学习Nginx,在网上看到别人介绍了一款强大的内核探测工具Systemtap,于是便准备学习下这款探测工具为以后代码分析做准备. 第一步便是安装.在自己电脑上安装的时候,也是费了一番劲儿. ...
- 循序渐近学docker---笔记
1.安装docker 环境:ubuntu 16.04 sudo apt-get install docker.io root@ld-Lenovo-G470:~# docker -vDocker ver ...
- webApp禁止用户保存图像
img { -webkit-touch-callout: none; }
- windows服务状态自动启动
很多人制作成Windows服务安装包时发现明明在属性里面设置了自动启动,可在服务安装完成以后,还需要手动启动服务,我这里有一种完全实现自动启动的方法 在ProjectInstaller.cs 文件做文 ...