2017-04-25 8 views
4

나는 선언 된 함수에 전달 된 값을 가져와이를 인쇄해야하는 LLVM 패스를 작성하고 있습니다. 선언 된 함수가 LLVM IR에서 호출됩니다.LLVM 런타임 중에 선언 된 함수의 인수 값을 얻습니다.

모듈 패스를 작성하여 프로그램의 모든 명령어를 반복 처리했습니다. 다음과 같이 명령에 호출 된 함수의 인수를 얻을 수있는 단편이다

라고하기 기능에 대한 LLVM IR 이런 식으로 뭔가 보이는 그러나 경우
for (auto &B: F){ 
       for (auto &I: B){ 
        if (auto *InvokeI = dyn_cast <InvokeInst>(&I)) { 
         if (InvokeI->getCalledFunction()->getName().str() == "function_name") { 
          errs() << "===\n"; 
          errs() << *(InvokeI->getOperand(0)) <<"\n"; 
          errs() << *(InvokeI->getOperand(1)) <<"\n"; 
          errs() << *(InvokeI->getOperand(2)) <<"\n"; 
         } 
        } 
       } 

} 

: 다음 내 위의 코드를

invoke void @function_name(i8* %4, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #5 
      to label %36 unwind label %6 

을 스 니펫 출력 :

%4 = call i8* @__cxa_allocate_exception(i64 4) #2 
i8* bitcast (i8** @_ZTIi to i8*) 
i8* null 

함수 호출 중에 전달되는 실제 값을 출력하는 대신.

제 질문은 런타임 중에 전달되는 값을 얻는 방법입니다. 아무 것도 반환하지 않는 선언 된 함수에 함수 본문을 추가 할 수있는 방법이 있습니까?

이에 어떤 도움 감사합니다, 감사

+0

이것은 예외를 생성하기위한'C++ abi' 호출입니다. pastebin이나 그 비슷한 곳에서 IR을 생성하는 원본 소스 코드의 최소한의 스 니펫을 제공 할 수 있습니까? – compor

+0

실제로 함수 이름은'__cxa_throw'이고 그 IR을 생성하는 코드 줄은 기본적으로'thow 1'뿐입니다. 그걸 잡으려고했는데 뭐든지 던져 버릴 겁니다 – Nik391

+0

조금 혼란 스럽습니다. 당신이 C++ [ABI] (https://itanium-cxx-abi.github.io/cxx-abi/)를 가리키는 것을 남겨 놓은 이후로 말이죠. – compor

답변

1

예외는 프로그램 실행 중에 시설을 제공하기 위해 프로그램의 제어 흐름을 변경합니다. 프로그램 스택을 조작하고 정리 등을 수행하는 런타임 구성으로서 runtime system 지원을 통해 해당 기능을 수행합니다. 이러한 이유로 구현 전반에 걸쳐 이것이 수행되는 방식을 표준화하는 ABI standard이 있습니다.

당신이 그 스펙을 파헤 치면, __cxa_throw에 대한 인수는 던져진 것임을 알 수 있습니다.. 보십시오 here을보십시오. 위의 단편은 유형 정보와 함께 할당 된 예외의 위치에 대한 포인터를 포함합니다. 실제로 c++filt_ZTIi에 적용하면 typeinfo for int이됩니다.

즉, throw 1 문에 의해 throw 된 정수 1은 런타임 중에 액세스 할 예외 객체 (즉, 메모리 위치)에 래핑됩니다. 이러한 값이 저장되는 위치 및 방법에 대한 자세한 내용은 앞서 언급 한 사양에 나와 있습니다. 정적 인 특정 값을 정적으로 액세스하는 방법은 보이지 않습니다. 어떤 예외가 활성 상태이고 정확한 내용이 실행 중 프로그램의 상태 (예 : 호출 스택 등)에 의존하기 때문입니다.

+0

니스, 입력 주셔서 고마워, 사실은 일종의 컴파일 시간에 예외를 잡으려고하면 복잡해진다. (분명히 지금 당장하고있다.) 그러나 JIT를 사용하면 런타임 중에 throw 인수를 grep하는 것이 더 좋을 것이다. 다시 나는 그것을 사용하는 방법을 확실히 모르겠다 :) – Nik391