Egloos | Log-in
F/OSS study
F/OSS study
[gcc] GCC Intermediate Representations (1) - GENERIC (tree)
gcc : 4.4.0


여기에서는 gcc가 프로그램을 컴파일하는 과정에서
소스를 어떤 형태로 나타내는지 (IR)에 대해서 알아볼 것이다.
gcc 4.x 버전에서는 다음과 같은 순으로 변환(lowering)된다.

Source code -> GENERIC -> GIMPLE -> SSA -> RTL -> Assembly

먼저 아래와 같은 간단한 프로그램을 컴파일 할 때 GENERIC tree의 구성을 살펴볼 것이다.

/* simple.c */
int main (void)
{
  int a;
  a = 0;
  return a;
}

다음과 같이 compile을 수행하면 이 프로그램에 대한 GENERIC tree의 구성을 dump 한다.

$ gcc simple.c --dump-tree-original-raw

다음은 출력 파일의 내용이다. (그리 길지 않으므로 전체를 옮겨본다)

;; Function main (null)
;; enabled by -tree-original

@1      bind_expr        type: @2       vars: @3       body: @4     
@2      void_type        name: @5       algn: 8      
@3      var_decl         name: @6       type: @7       scpe: @8     
                         srcp: simple.c:3              size: @9     
                         algn: 32       used: 1      
@4      statement_list   0   : @10      1   : @11      2   : @12    
@5      type_decl        name: @13      type: @2       srcp: <built-in>:0     
@6      identifier_node  strg: a        lngt: 1      
@7      integer_type     name: @14      size: @9       algn: 32     
                         prec: 32       sign: signed   min : @15    
                         max : @16    
@8      function_decl    name: @17      type: @18      srcp: simple.c:1     
                         link: extern 
@9      integer_cst      type: @19      low : 32     
@10     decl_expr        type: @2     
@11     modify_expr      type: @7       op 0: @3       op 1: @20    
@12     return_expr      type: @2       expr: @21    
@13     identifier_node  strg: void     lngt: 4      
@14     type_decl        name: @22      type: @7       srcp: <built-in>:0     
@15     integer_cst      type: @7       high: -1       low : -2147483648
@16     integer_cst      type: @7       low : 2147483647
@17     identifier_node  strg: main     lngt: 4      
@18     function_type    size: @23      algn: 8        retn: @7     
                         prms: @24    
@19     integer_type     name: @25      size: @26      algn: 64     
                         prec: 36       sign: unsigned min : @27    
                         max : @28    
@20     integer_cst      type: @7       low : 0      
@21     modify_expr      type: @7       op 0: @29      op 1: @3     
@22     identifier_node  strg: int      lngt: 3      
@23     integer_cst      type: @19      low : 8      
@24     tree_list        valu: @2     
@25     identifier_node  strg: bit_size_type           lngt: 13     
@26     integer_cst      type: @19      low : 64     
@27     integer_cst      type: @19      low : 0      
@28     integer_cst      type: @19      high: 15       low : -1     
@29     result_decl      type: @7       scpe: @8       srcp: simple.c:2     
                         note: artificial              size: @9     
                         algn: 32     

가장 먼저 눈여겨볼 것은 root 노드가 bind_expr이라는 것이다.
bind_expr은 C 소스 내에서 중괄호({, })로 둘러싸인 블럭을 나타내며
크게 다음과 같은 속성들을 가진다.
  • type: 해당 블럭의 (return) 타입. 아마도 gcc 확장 기능인 "statements in expression"을 위한 것인듯 싶다. 이 경우 블럭의 return 타입은 제일 마지막 statement의 값을 따른다.
  • vars: 해당 블럭 내에 선언된 local 변수들의 목록. 여기서는 제일 처음에 선언된 변수 만을 가리키며, 다음 변수는 tree 구조체의 chain 필드에 의해 추적할 수 있다.
  • body: 해당 블럭 내에 포함된 실행 문장들의 목록
위의 경우에서 각각은 순서대로 void_type, var_decl, statement_list 노드가 할당되었다.

타입에 대한 노드는 선언(decl)에 대한 노드와 연관되는데
void_type 노드의 name은 type_decl (@5) 노드를 가리키며
type_decl 노드의 type은 다시 void_type 노드를 가리키게 되어 서로를 참조한다.
또한 type_decl 노드는 해당 타입의 이름을 저장하고 있는 identifier_node를 name으로 참조한다.

var_decl (@3) 노드의 경우도 type_decl 노드와 비슷한데
추가로 변수가 저장될 scope 필드와 변수의 크기를 나타내는 size 필드를 가진다.
여기서 scope는 function_decl 노드를 가리키게 된다. (나중에 자세히 살펴볼 것이다.)

상수를 나타내는 노드는 뒤에 _cst 라는 접미어가 붙는다.
해당 상수의 값은 그냥 low 필드의 값이라고 생각할 수 있을 듯 하다.
(여기서 high 필드가 나타내는 의미는 아직 명확치는 않다.)

소스에서 직접 나타난 상수의 경우 소스 코드 상의 타입과 일치하는 노드를 만들지만 (@7)
compiler 내부에서 사용하는 수의 경우 bit_size_type이라는 64비트 unsigned 정수형을 사용한다. (@19)
(bit_size_type은 내부에서만 사용하므로 별도의 type_decl 노드가 존재하지 않는 듯 하다.
void나 int 타입의 경우 실제로는 존재하지 않지만 (srcp 값이 builtin이다) type_decl 노드가 존재한다.)

실행할 문장은 statement_list 노드 내의 목록에 추가되는데
위의 경우는 각각 decl_expr, modify_expr, return_expr 순이다.

decl_expr (@10) 노드는 변수 선언에 관련된 것이고
modify_expr (@11) 노드는 assignment에 해당하는 것으로 op0 = op1과 같은 형태가 된다.
return_expr (@12) 노드는 함수의 return에 해당하는 것인데 return 자체의 타입은 void이지만
인자로 modify_expr (@21) 노드를 가지며 이는 가상의 (artificial) 결과 변수 (@29)에
값을 assign하는 역할을 수행한다. 이 modify_expr의 타입은 int (@7)이다.

function_decl (@8) 노드는 해당 함수의 정보를 나타내는 것으로
static 키워드를 지정하지 않았으므로 linkage는 extern이 될 것이고
return type은 int (@7), parameter는 tree_list (@24)가 되는데
여기서는 void로 선언되었으므로 tree_list는 void_type (@2) 노드를 가리키게 된다.

전체 tree를 간략히 그림으로 나타내보면 다음과 같다.
(type 정의에 필요한 일부 상수들 제외, identifier는 값 만 표기)


by namhyung | 2009/09/19 01:19 | System | 트랙백(2) | 덧글(0)
트랙백 주소 : http://studyfoss.egloos.com/tb/5117056
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from F/OSS study at 2009/11/11 11:55

제목 : [gcc] GCC Intermediate Repre..
gcc : 4.4.0 이전 글 보기: [gcc] GCC Intermediate Representations (1) - GENERIC (tree) 이번에는 GIMPLE에 대해서 알아보기로 하자. GIMPLE은 McGill 대학에서 진행한 McCAT 프로젝트에서 사용하던 SIMPLE이라는 IR을 GCC로 포팅하여 필요한 기능들을 추가한 것으로 GENERIC에 비해 단순한 형태의 statement 만을 지원한다. 즉, GIMPL......more

Tracked from tomato_house at 2010/02/09 12:55

제목 : [gcc] GCC Intermediate Repre..
[gcc] GCC Intermediate Representations (1) - GENERIC (tree)...more

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
perf scm algorithm sed script patch C glibc kernel synchronization documentation compiler vcs computer-architecture x86 SMP gcc binutils git linux CAaQA3 bash memory blktrace block-layer elf CARM emacs build awk
전체보기
이글루 파인더

최근 등록된 덧글
informsi yang bagus dan be..
by pordanaia at 08/05
Informsi yang bagus dan b..
by jamalsu at 08/01
as inforasi yang menarik http..
by jamalsu at 07/22
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X