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 ...
随机推荐
- ConcurrentHashMap 原理分析
1 为什么有ConcurrentHashMap hashmap是非线程安全的,hashtable是线程安全的,但是所有的写和读方法都有synchronized,所以同一时间只有一个线程可以持有对象,多 ...
- 如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦.所以,在实践中会用到很多工 ...
- Array数组基本案例:图书基本录入输出系统
import java.util.Scanner; public class ArrayTest{ public static void main(String args[]){ Scanner sc ...
- 模仿ios下的coverflow
Android高级图片滚动控件,编写3D版的图片轮播器 http://blog.csdn.net/guolin_blog/article/details/17482089 A cool Open So ...
- Linux shell入门基础(七)
七.bash脚本中的流程控制 条件判断控制 -[]([]中的表达式是否为真) &&(前边的结果是true的时候执行后边的命令) ||(前边的结果是false的时候执行后边 ...
- AS 2.0新功能 Instant Run
Instant Run上手 作为一个Android开发者,很多的时候我们需要花大量的时间在bulid,运行到真机(虚拟机)上,对于ios上的Playground羡慕不已,这种情况将在Android S ...
- android TimerTask 的简单应用,以及java.lang.IllegalStateException: TimerTask is scheduled already错误的解决方法【转】
Android应用开发中常常会用到定时器,不可避免的需要用到 TimerTask 定时器任务这个类下面简单的一个示例演示了如何使用TimerTask这个示例演示了3秒未有触屏事件发生则锁屏(只是设置下 ...
- 登录模块需要用到session留底
<% HttpSession sessions=request.getSession(); Object sessionValues=sessions.getAttribute("ui ...
- Java编程思想-注解生成外部例子代码
如果本文帮助到您,请点击下面的链接,这是本人的网站,以示鼓励,谢谢!链接绝对安全! 本人的网站 java注解属于java中高大上的功能,许多开源框架都使用了java注解的功能.比如spring,hib ...
- .Net程序员 Solr-5.3之旅 (一)Solr入门
阅读目录 引言 Lunece是什么? Solr是什么 JAVA环境搭建 JAVA环境搭建之变量配置 Tomcat简单配置 结尾 引言 君子生非异也,善假于物也. Java和.Net哪个好,我们也不需要 ...