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. 10个经典的Java面试题

    这里有10个经典的Java面试题,也为大家列出了答案.这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高.让我们一起来看看吧. 1.Java的HashMap是如何工作的? ...

  2. Lucene实例教程

    Lucene是apache组织的一个用java实现全文搜索引擎的开源项目. 其功能非常的强大,api也很简单.总得来说用Lucene来进行建立 和搜索和操作数据库是差不多的(有点像),Document ...

  3. bootstrap 仿实例

    bootstrap实现一个网页 html文件 <!DOCTYPE html> <html> <head lang="en"> <meta ...

  4. Swift-Dictionary

    1.字典写法 Dictionary<KeyType,ValueType>,KeyType是你想要储存的键,ValueType是你想要储存的值. 唯一的限制就是KeyType必须是可哈希的, ...

  5. google(转帖)

    本帖最后由 qiushui_007 于 2014-6-10 16:14 编辑 IP Addresses of Google Global Cachewww.kookle.co.nr Bulgaria  ...

  6. firebug中console命令尝试

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. IE浏览器中设为首页

    <a onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('<%=Configurati ...

  8. 抓取锁的sql语句-第四次修改

    --完成情况   变量V_BLOCKING_SID 用来动态抓取 产生锁的会话id,输出参数没有任何问题,但是执行报错  标识符无效! CREATE OR REPLACE PROCEDURE SOLV ...

  9. iOS中使用UIWebView与JS进行交互

    iOS中使用UIWebView与JS进行交互 前一段忙着面试和复习,这两天终于考完试了,下学期的实习也有了着落,把最近学的东西更新一下,首先是使用UIWebView与JS进行交互 在webView中我 ...

  10. 本地代码上传 -> Github

    首先在控制台cd到你的本地项目,这里以teat为例 1.执行命令:  git init 2.将项目文件添加到仓库中:  git add . (可以是指定文件,将“.”转换为指定文件) 3.接下来com ...