Egloos | Log-in
F/OSS study
F/OSS study
[gcc] GCC Intermediate Representations (2) - GIMPLE
gcc : 4.4.0

이전 글 보기: [gcc] GCC Intermediate Representations (1) - GENERIC (tree)


이번에는 GIMPLE에 대해서 알아보기로 하자.
GIMPLE은 McGill 대학에서 진행한 McCAT 프로젝트에서 사용하던 SIMPLE이라는 IR을
GCC로 포팅하여 필요한 기능들을 추가한 것으로
GENERIC에 비해 단순한 형태의 statement 만을 지원한다.

즉, GIMPLE은 GENERIC tree에서 statement에 해당하는 것들 만을 대상으로 하며
각 statement에서 사용하는 operand들은 그대로 (GENERIC) tree 형태로 남아있게 된다.

일단 앞에서 사용한 예제를 GIMPLE로 변환한 것을 보면 다음과 같다.

$ gcc simple.c -fdump-tree-gimple-raw
$ cat simple.c.004t.gimple
main ()
gimple_bind <
  int D.1234;
  int a;

  gimple_assign <integer_cst, a, 0, NULL>
  gimple_assign <var_decl, D.1234, a, NULL>
  gimple_return <D.1234>
>

먼저 main() 함수의 body는 gimple_bind statement로 이루어진다.
gimple_bind는 GENERIC의 bind_expr에 대응하는 것으로
C 소스 코드에서 중괄호 ({ ... })로 이루어진 block을 나타내는 것이다.

이렇게 gimple_bind 나 EH (exception handling), loop, nested function 등을 포함한 형태를
high GIMPLE이라고 하며, 이후 control flow를 linear하게 만드는 과정에서 (pass_lower_cf)
이러한 복잡한 control flow은 모두 분리되어 goto로 대체된다.
이렇게 만들어진 형태를 low GIMPLE이라고 부른다.
(아직 low GIMPLE을 dump하는 방법은 찾지 못했다..)

새로 생긴 D.1234라는 변수는 return statement에 의해 만들어진 것이다.
앞서 GENERIC에서 return_expr은 modify_expr을 포함하며
이는 result_decl을 통해 가상의 변수를 하나 선언하는 것을 보았었다. (@29)
다음은 a 변수의 선언인데
GENERIC의 경우 변수 선언은 decl_expr의 형태로 존재하였으나
GIMPLE에서는 변수 선언 자체는 statement로 고려하지 않는 듯 하다.

다음으로 나오는 gimple_assign 부터가 실제 gimple statement이며
제일 처음 나오는 gimple_assign, gimple_return 등이 GIMPLE code에 해당한다.
gimple_assign의 경우는 sub code를 포함하는데 이는 RHS의 type 혹은 operation을 나타낸다.
첫 번째 statement는 'a = 0;' 이라는 소스 코드에 대응하며 (0은 정수 타입의 상수),
두 번째 statement는 'D.1234 = a;'와 같은 의미를 지닌다 (a는 변수).

또한 (위의 예제에서는 볼 수 없지만) GIMPLE은 최대 3개의 operand 만을 받을 수 있기 때문에
(function call과 같은 몇몇 예외 상황이 있기는 하다.)
여러 operand로 이루어진 expression은 필요에 따라 다음과 같이 분리된다.

simple2.c : (C source)
  a = b + c + d;

simple2.c.003t.orignal : (GENERIC)
  @3      var_decl         name: @6       type: @7       scpe: @8  ;; int a
  @14     modify_expr      type: @7       op 0: @3       op 1: @23
  @23     plus_expr        type: @7       op 0: @32      op 1: @33
  @32     plus_expr        type: @7       op 0: @35      op 1: @36   
  @33     var_decl         name: @37      type: @7       scpe: @8  ;; int d
  @35     var_decl         name: @38      type: @7       scpe: @8  ;; int b
  @36     var_decl         name: @39      type: @7       scpe: @8  ;; int c

simple2.c.004t.gimple : (GIMPLE)
  gimple_assign <plus_expr, D.1237, b, c>
  gimple_assign <plus_expr, a, D.1237, d>

즉, GENERIC의 경우는 source 코드와 같이 modify_expr의 operand가
(plus_expr (plus_expr b c) d)로 표현되는 반면 (tree 형태),
GIMPLE의 경우는 임시 변수 D.1237을 이용하는 statement가 추가되었다.
이와 같은 제약으로 인해 GIMPLE statement를 tuple이라고 부르기도 한다.
by namhyung | 2009/11/11 11:55 | System | 트랙백(1) | 덧글(4)
트랙백 주소 : http://studyfoss.egloos.com/tb/5167039
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from tomato_house at 2010/02/09 16:23

제목 : [gcc] GCC Intermediate Repre..
[gcc] GCC Intermediate Representations (2) - GIMPLE...more

Commented by SY Kim at 2009/11/17 22:39
좋은 내용 잘 봤습니다.

gcc에 매우 정통하신것 같은데, gcc 주요 옵션(-f....)에 대한 것도 정리해보실 생각은 없으신가요?
Commented by namhyung at 2009/11/21 12:16
과찬의 말씀이십니다.. 아직 많이 부족합니다.

최적화 옵션 및 각 과정에 대한 정리는 마음은 있으나 아직 시간과 실력이 따르지 않네요.
이후에 여유가 좀 생기면 도전해 볼 생각은 있습니다만.. ;;
Commented by tomato_house at 2010/02/09 16:26
내용 잘 읽어 봤습니다. .. 현재 컴파일러 입문단계인데, 많은 도움이 되었습니다....

좋은 정보가 있다면 후에 공유하도록 하겠습니다..

너무너무,, 몰라서,, 걱정이에요.ㅠㅠ.. 그럼.. 수고하세요..^^
Commented by namhyung at 2010/02/10 12:03
도움이 되셨다니 다행입니다.. ^^

:         :

:

비공개 덧글

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

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

최근 등록된 덧글
http://serbaserbiinfoterkini56..
by cakra at 09/22
informsi yang bagus dan b..
by cakra at 09/16
informsi yang bagus dan be..
by pordanaia at 08/05
최근 등록된 트랙백
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