2017-03-03 3 views
0

이 질문은 gcc 내부에 초점을 맞추고 있습니다. 나는 gcc generic trees를 실험하고있다. 이 작은 프로젝트는 교육 목적으로 하드 코드 된 프런트 엔드를 컴파일하는 것에 관한 것입니다. printf를 외부에서 호출 할 수 있었으며 테스트 메시지를 인쇄 할 수있는 실행 파일을 컴파일 할 수있었습니다. 후자는 필자가 함수에 대한 인수를 준비 할 수 있다는 증거이다. 문제의 핵심은 내 자신의 함수/메소드를 호출하고 그 인수를 검색하는 것입니다.gcc 함수 트리 노드에서 함수 인수 검색

tree testFn; 
    tree testFndeclTypeParam[] = { 
           integer_type_node 
           }; 
    tree testFndeclType = build_varargs_function_type_array(integer_type_node, 1, testFndeclTypeParam); 
    tree testFnDecl = build_fn_decl("testFunc", testFndeclType); 
    DECL_EXTERNAL(testFnDecl) = 1; 
    testFn = build1(ADDR_EXPR, build_pointer_type(testFndeclType), testFnDecl); 
    tree exprTest = build_int_cst_type(integer_type_node, 20); 
    tree testStmt = build_call_array_loc(UNKNOWN_LOCATION, integer_type_node, testFn, 1, testArgs); 
    append_to_statement_list(testStmt, &stackStmtList); 

나는 기능 "testFunc은"확실히이라는 것을 확인할 수 있습니다 내가 전화를 준비하는 곳입니다

.

지금 다른 측면은, 여기에 호출되는 함수입니다 :

// Built type of main "int (int)" 
    tree mainFndeclTypeParam[] = { 
           integer_type_node, // int 
           }; 

    tree mainFndeclType = build_function_type_array(integer_type_node, 1, mainFndeclTypeParam); 
    tree mainFndecl = build_fn_decl("testFunc", mainFndeclType); 
    tree stackStmtList = alloc_stmt_list(); 
    tree parmList = build_decl(UNKNOWN_LOCATION, PARM_DECL, mainFndecl, integer_type_node); 

내가 인수를 검색하는 방법을 보여주는 명백한 예를 찾을 수 없습니다, 그러나 PARMLIST 될 것으로 예상 인수의 트리 노드입니다.

+1

최소한의 완전하고 독립적 인 소스 코드 예제를 제공해주십시오. 콘솔에 대한 적절한 컴파일/링크 명령을 보내 주시면 감사하겠습니다. – Scheff

+0

@Scheff 자립적 인 사례가 많아서 관심을 가져 주셔서 감사합니다. 나는 커맨드 라인 "gccsample main.exp testFunc.exp"를 사용한다. 두 파일은 컴파일러를 호출하기위한 더미입니다. – Tanyong

답변

0

다음은 gcc 컴파일러 디자인에 관심이있는 사람들을위한 제 문제에 대한 해결책입니다. 구글이나 자바 프론트 엔드를 유지해 주신 분께 감사드립니다.

이 있어야한다 :

tree typelist = TYPE_ARG_TYPES(TREE_TYPE(mainFndecl)); 
tree typeOfList = TREE_VALUE(typelist); 
tree parmList = build_decl(UNKNOWN_LOCATION, PARM_DECL, NULL_TREE, typeOfList); 
tree *ptr = &DECL_ARGUMENTS(mainFndecl); 
*ptr = parmList; 

다음 인수가있는 경우, TREE_CHAIN를 사용하여 검색 할 수 있습니다.