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的更多相关文章

  1. GNU C 扩展(转)

    GNU CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.这里对支持支持 GNU 扩展的 C 语言成为 GN ...

  2. Linux 内核使用的 GNU C 扩展

    gcc核心扩展linuxforum(转)=========================== Linux 内核使用的 GNU C 扩展 =========================== GNC ...

  3. GNU C 扩展之__attribute__ 机制简介

    在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...

  4. GNU GCC 扩展属性

    http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html constructor destructor constructor (prior ...

  5. 关于GNU规范的语法扩展

    GNU 是一款能用于构建类 Unix 操作系统的计算机软件合集,由自由软件之父 Richard Stallman 开创,于 1983 年 9 月 27 日对外发布.GNU 完全由自由软件(free s ...

  6. 了解甚少的GNU C的__attribute__ 机制

    平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的 差距---内功.熟练码农和码神的最大区别估计就是内功是否深厚了.在自我反思的过程中,也要逐渐的积累一些 ...

  7. GNU C编译器的gnu11和c11

    国际标准组织发布c11后,gnu为自己的编译器发布两种标准gnu11和c11 gnu11:带gnu c扩展的c11标准,如果你的代码包含了typeof,__attribute__等等gnu的扩展,就必 ...

  8. 【转载】 GNU GCC 选项说明

    GCC 1 Section: GNU Tools (1) Updated: 2003/12/05 Sponsor: GCC Casino Winning Content NAME gcc,g++-GN ...

  9. gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)

    总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...

随机推荐

  1. linux 挂载ISO

    首先,将作为源的iso的挂载到系统上. 代码如下: mount -o loop /xxx/xxx.iso /mnt/iso/ 其中/mnt/iso是事先在本地建立的文件夹. 然后将文件iso.repo ...

  2. Centos 多个mysql数据库

    一.编译安装第一个MySQL 5.1.33 ? cd /opt   /usr/sbin/groupadd mysql   /usr/sbin/useradd -g mysql mysql -s /bi ...

  3. ckfinder 1

    网上的破解教程对于2.4版本来说已经过时了. 以下是CKFinder 2.4 ASP.NET的亲测可用破解方法,经测试,只需修改两处代码. 打开ckfinder.js, 步骤1. 搜索替换如下代码: ...

  4. [AngularJS] Use ng-model-options to limit $digest

    Refer: http://toddmotto.com/super-fast-angular-ng-model-options-limit-digest-cycles/ Use: <input ...

  5. 给iOS开发者的GCD用户手册

    Grand Central Dispatch,或者GCD,是一个极其强大的工具.它给你一些底层的组件,像队列和信号量,让你可以通过一些有趣的方式来获得有用的多线程效果.可惜的是,这个基于C的API是一 ...

  6. Python多线程锁

    [Python之旅]第六篇(四):Python多线程锁   python lock 多线程 多线程使用方法 多线程锁 摘要:   在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...

  7. 【VB】StrConv函数 vbUnicode用法

    [VB]StrConv函数 StrConv(string, conversion, LCID) vbUnicode 64 根据系统的缺省码页将字符串转成Unicode. vbFromUnicode 1 ...

  8. HDU5311

    题意:给一个指定的字符串a,要求分成三段,然后再给定另外一个字符串b,要求a中的三段能否在b中找到. 思路:枚举+模拟,首先枚举给定的字符串a,因为分成三段,所以一共有(1+9)*9/2种情况,对于分 ...

  9. 阿里UX矢量图标库–最强大的矢量图标库(Icon font制作力荐工具)

    继前面介绍过ICON-FONT的制作后,找了几个ICON库都是国外的今天偶然发现阿里巴巴的图标矢量库,www.iconfont.cn用了之后感觉很强大,丰富的图标库(集合阿里妈妈&淘宝的图标库 ...

  10. xp snapshot.

    snap current active window(alt + Print Screen SysRq). snap the whole window (Print Screen SysRq).