Egloos | Log-in
F/OSS study
F/OSS study
[gcc] 컴파일 최적화 과정 - warn unused result
gcc: 4.5.0


gcc 버전이 4.5로 올라가면서 최적화 과정에도 많은 변경이 일어났다.
lowering pass쪽도 많이 바뀌어서 이전에 살펴본 remove useless stmts는 사라지고 (;;)
대신 warn unused result pass가 그 자리에 추가되었다.

이 과정은 상당히 단순한데 이름에서 알 수 있듯이
함수 호출 결과를 이용하지 않는 경우에 경고를 보여주는 역할을 한다.
단 해당 함수가 "warn_unused_result" attribute를 가지고 있어야 하며
gcc 호출 시 -Wno-unused-result 플래그가 지정되지 않아야 한다.
(기본값은 -Wunused-result로 지정되어 있다.)

이 과정을 기술하는 opt_pass 구조체는 다음과 같이 정의된다.

tree-cfg.c:
struct gimple_opt_pass pass_warn_unused_result =
{
  {
    GIMPLE_PASS,
    "*warn_unused_result",        /* name */
    gate_warn_unused_result,        /* gate */
    run_warn_unused_result,        /* execute */
    NULL,                /* sub */
    NULL,                /* next */
    0,                    /* static_pass_number */
    TV_NONE,                /* tv_id */
    PROP_gimple_any,            /* properties_required */
    0,                    /* properties_provided */
    0,                    /* properties_destroyed */
    0,                    /* todo_flags_start */
    0,                    /* todo_flags_finish */
  }
};

gate_warn_unused_result() 함수는 단순히 플래그 지정 여부를 통해 판단한다.

static bool
gate_warn_unused_result (void)
{
  return flag_warn_unused_result;
}

실제 실행 과정은 run_warn_unused_result() 함수가 수행하는데
이는 현재 함수에 대해 do_warn_unused_result() 함수를 호출할 뿐이다.
이 함수는 gimple_stmt_iterator를 이용하여 함수 내의 모든 statement를 조사하는데
다음과 같은 함수 호출이 수행되는 부분에 대해서만 검사한다.

static void
do_warn_unused_result (gimple_seq seq)
{
  tree fdecl, ftype;
  gimple_stmt_iterator i;

  for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
    {
      gimple g = gsi_stmt (i);

      switch (gimple_code (g))
    {
      ...
      
    case GIMPLE_CALL:
      if (gimple_call_lhs (g))
        break;

      /* This is a naked call, as opposed to a GIMPLE_CALL with an
         LHS.  All calls whose value is ignored should be
         represented like this.  Look for the attribute.  */
      fdecl = gimple_call_fndecl (g);
      ftype = TREE_TYPE (TREE_TYPE (gimple_call_fn (g)));

      if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
        {
          location_t loc = gimple_location (g);

          if (fdecl)
            warning_at (loc, OPT_Wunused_result,
                "ignoring return value of %qD, "
                "declared with attribute warn_unused_result",
                fdecl);
          else
            warning_at (loc, OPT_Wunused_result,
                "ignoring return value of function "
                "declared with attribute warn_unused_result");
        }
      break;

    default:
      /* Not a container, not a call, or a call whose value is used.  */
      break;
    }
  }
}

생략한 부분은 여러 statement를 포함하는 복합문(container)인 경우 실제 statement list에 대해
재귀적으로 do_warn_unused_result() 함수를 호출하는 코드이다.

함수 호출 (GIMPLE_CALL)인 경우 먼저 LHS 즉, 함수의 반환값을 저장하는지 검사한다.
저장한다면 함수 호출 결과를 사용하는 것이므로 아무 문제없이 다음으로 넘어간다.

그렇지 않다면 먼저 gimple_call_fndecl()을 통해
현재 statement에서 호출하려는 함수의 선언 정보를 가져온다. (FUNCTION_DECL)
만약 어떤 이유에서건 선언 정보를 가져오지 못했다면 fdecl에 NULL이 저장된다. (NULL_TREE)

그리고 해당 함수의 attribute 중에서 "warn_unused_result"가 지정되었는지 확인하여
warning_at() 함수를 통해 경고 메시지를 출력한다.

다음과 같은 간단한 예제를 통해 확인해 보기로 하자.

wur.c:
int __attribute__((warn_unused_result))
foo(void)
{
  return -1;
}

int main(void)
{
  foo();
  return 0;
}

컴파일 시에 다음과 같은 메시지가 출력될 것이다.

$ gcc wur.c
wur.c: In function ‘main’:
wur.c:9:6: warning: ignoring return value of 'foo', declared with attribute warn_unused_result
$
$ gcc -Wno-unused-result wur.c
$

만약 어떤 함수를 작성할 때 해당 함수의 반환값을 항상 확인해야 하는 경우라면
함수 선언 시 warn_unused_result attribute를 지정하여 경고를 띄울 수 있을 것이다.

by namhyung | 2010/05/06 19:56 | System | 트랙백(3) | 덧글(3)
트랙백 주소 : http://studyfoss.egloos.com/tb/5310361
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from C at 2011/11/11 18:14

제목 : ignoring return value of 'sy..
system("ls"); 이런식으로 썼을 때 warning : ignoring return value of 'system', declared with attribute warn_unused_result 이 난다. 한수가 아래와같이 선언되면 warning을 출력한다. int __attribute__((warn_unused_result)) foo(void) { return -1; } 따라서, int re = system("ls"); warning이......more

Tracked from C at 2011/11/11 18:15

제목 : ignoring return value of 'sy..
system("ls"); 이런식으로 썼을 때 warning : ignoring return value of 'system', declared with attribute warn_unused_result 이 난다. 한수가 아래와같이 선언되면 warning을 출력한다. int __attribute__((warn_unused_result)) foo(void) { return -1; } 따라서, int re = system("ls"); warning이......more

Tracked from at 2014/03/11 00:33
Commented by 이상훈 at 2010/05/19 14:25
안녕하세요 ^^;ㅎ
GCC Source Analysis third team의 이상훈입니다.
gcc-4.5.0를 설치하신 것 같은데, 현재 제가 MPC, MPFR, GMP를 install하고,
gcc-4.5.0들어가서 ./configure를 수행하고, make를 하는 도중에 오류가 발생했습니다.
에러가 발생한 부분이 libgcc에서 발생을 했는데, 남형님 Architecture와 제 Architecture가 동일한것 같아서 질문드립니다.
.
질문 게시판에도 글 올려놨는데, 좀 부탁드리겠습니다 ^^;ㅎ
그리고 여담이지만, 현재 GCC 분석 스터디가 인원이 별로 없습니다 ㅋ
혹여나 함께 스터디 할 수 있으면, 좋을 것 같습니다 ?!
Commented by namhyung at 2010/05/19 16:21
iamroot의 게시판에 답글 달아놓았습니다. (도움이 되실지는 모르겠네요..)
참고로 제가 최근에 PC를 업그레이드해서 현재 x86_64 아키텍처를 사용 중입니다.
물론 기존에 사용하던 x86 노트북도 있긴 하지만요..

그리고 스터디 참가는 여건 상 불가능할 것 같습니다.
열심히 공부하셔서 좋은 결과 얻으시길 바랍니다.. ^^;
Commented by ioopoi at 2014/11/11 20:37
질문 게시판에도 글 올려놨는데, 좀 부탁드리겠습니다 그리고 여담이지만, 현재 GCC 분석 스터디가 인원이 별로 없습니다 ㅋ
혹여나 함께 스터디 할 수 있으면, 좋을 것 같습니다 제가 최근에 PC를 업그레이드해서 현재 x86_64 아키텍처를 사용 중입니다.물론 기존에 사용하던 x86 노트북도 있긴 하지만요.
online phd programs
http://www.phdonlineprograms.biz/top-phd-online-programs/

:         :

:

비공개 덧글

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

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

최근 등록된 덧글
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