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. Freemarker数字转时间

    使用freemarker模板,展示一个时间字段,数据库保存的是毫秒.在网上找了许多文章,发现都是针对date或者是直接类似"1999-09-09"这样已经成型字符串进行操作的,心中 ...

  2. css分割线 文字居中的7种实现方式

    最近开始研究前端,会不定期更新一些小块代码,写下自己的学习笔记,也希望能和大家一起进步! 1.单个标签实现分隔线: <html> <head lang="en"& ...

  3. Prefix.pch的作用和用法

    一般用于放置宏,省去xcode编译的时间 Hello World_Prefix.pch:扩展名.pch表示"precompiled header",这是一个你工程要用到的来自于外部 ...

  4. 需要知道的开源的框架-IOS

    1:SDWebImage,UIImageView+WebCache加载一张图片. 2:UIViewExt用于定位坐标很有用,可以直接拿到bottom,top,left,right. 转:http:// ...

  5. rpc远程过程协议调用

    在linux 5.X以及下的版本你可以通过service portmap status命令查看rpc是否启动.如果提示running,表示正在运行:如果提示stop就是关闭了.如果没有安装,则通过安装 ...

  6. getopt 分析命令行参数 -n -t 1

    在Linux中,我们常常用到 ls -l 等等之类带有选项项的命令,下面,让我们用C++来实现该类似的命令. 在实现之前,首先,我们来介绍一下一个重要函数:getopt() 表头文件 #include ...

  7. Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager

    第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...

  8. C#—集合(Collection)

    1.栈(stack<T>) using System; using System.Collections.Generic; using System.Linq; using System. ...

  9. Codeforces#313

    A题 题意:给n个基础币值,问你是否能组成所有种类的币值,能则输出-1,不能则输出不能组成的最小币值. 思路:理解了题意就明白了,1是关键解. #include <iostream> #i ...

  10. Dedecms当前位置{dede:field name='position'/}修改

    这个实在list_article.htm模板出现的,而这个模板通过loadtemplage等等一系列操作是调用的include 下的arc.archives.class.php $this->F ...