2017-01-21 6 views
0

그래서 특정 호출 명령어가 호출 된 횟수를 유지하려고 노력하고 있으며 명령어를 고유하게 식별하는 데 어려움을 겪고 있습니다. 설명서에서 지침 ID로 뭔가를 찾을 수 없습니다. ID를 가져 와서 작업 수행 방법을 알고있는 외부 함수에 전달하려고합니다.LLVM Pass에서 명령어를 고유하게 식별하는 방법은 무엇입니까?

문제는 어떻게하면 해당 지침에 대해 고유 한 ID를 얻을 수 있습니까?

+1

"Instruction *"의 포인터 값을 ID로 사용할 수 있습니다. – arrowd

+0

안녕하세요! @arrowd! 댓글 주셔서 감사합니다. 그럼 명령의 주소를 말하는 겁니까? 또한, 주소 변경 수 없습니다? –

+0

또한 질문의 두 번째 부분 인 Int 나 다른 원시 데이터 형식 (명령 유형에 대한 포인터가 아닌)으로 어떻게 가져올 수 있습니까? –

답변

1

나는 런타임 인 ​​을 계산하고, 가까운 전화 걸기 명령을 수행하는 코드를 삽입하고 있습니다.이 경우 Instruction 포인터가 잘 작동합니다. Instruction을 움직이면 포인터가 변경되지 않고 Instruction을 삭제하면 포인터가 유효하지 않게됩니다.

포인터를 정수로 변환하려면 static_cast<uintptr_t>(i)을 사용하십시오.

0

가능한 경우 호출 명령어의 유형을 알고 있다면 가능한 모든 유형의 호출 명령어에 대한 열거 형을 선언하고 해당 열거 형을 호출 할 때마다 열거 형 값을 계산 함수로 전달할 수 있습니다. 매개 변수 값.

가능한 모든 호출 지침을 모르는 경우 호출 명령에서 호출 한 함수의 이름을 계산 기능에 전달할 수 있습니다. 이 경우 함수 이름의지도와 함수의 수를 유지하는 방식으로 계산 함수를 구현해야합니다.

호출 명령어가 특정 호출에 대한 값 (Value*)을 반환하기 때문에 얻은 ​​모든 Instruction* 포인터는 고유 할 것이라고 생각합니다. 따라서 포인터 값을 ID로 사용하면 사용자 목적에 부합하지 않습니다.