2009年10月30日 星期五

GNU C Expand

1. __attribute__ ((variable attributes))

variable attributes:

• aligned
• deprecated
• mode
• nocommon
• packed
• section
• transparent_union
• unused
• vector_size
• weak

section ("section-name")'
extern void foobar (void) __attribute__ ((section ("bar")));
puts the function 『foobar' in the 『bar' section.


example:


#define subsys_initcall(fn) __define_initcall("4",fn,4)
//用來將指定的函數pointer fn放到initcall.init section
//是把fn放到.initcall.init的section.initcall4.init


initcall4.init defined in arch/i386/kernel/vmlinux.lds.S

.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET)
{
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}


2. likely and unlikely

in include/linux/compiler.h

#define __builtin_expect(x, expected_value) (x)

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)


example:

if(likely(value))
{
}
else
{
}


//看起來likely和unlikely是一樣的, 但事實上是有差異的
//likely表示value的值為true的可能性更大一些,那麼執行if的機會大;
//unlikely表示value的值為false的可能性大一些,執行else機會大一些。
//有了這種修飾,gcc編成組語後,
//會將likely使得if後面的執行語句緊跟著前面的;
//unlikely使得else後面的語句緊跟著前面的程序
//這樣就會可以讓cache預先讀取,
//目的是增加程序的執行速度

2009年10月6日 星期二

Meld : Diff and merge tool

比較和合併code的工具,在windows上有[Araxis Merge],但它並非open source software,因此有[WinMerge]可以替代,而在linux上比較常見的是[KDiff3]和[Meld]。

而我最常用的是Meld,它的操作很容易就可上手。

2009年10月2日 星期五

Coding tips, Vim顯示當前行

輸入":set cursorline".
或輸入":set cul".

取消當前行:
輸入":set no cursorline".
或輸入":set no cul"

2009年9月28日 星期一

gcc: warnings being treated as errors

在Ubuntu 9.04,編譯linux kernel for mips時出現了這個問題

gcc: warnings being treated as errors
scripts/kconfig/conf.c:104: error: ignoring return value of 'fgets', declared with attribute warn_unused_result
...

原來是在./src/Makefile的HOSTCFLAGS variables加了-Werror...
把它去掉之後,就能編過了...