제목이 모든 것을 설명합니다. LLVM IR 모듈 패스를 작성 중이며 현재 모듈에 해당하는 소스 코드의 절대 경로를 알아야 합니다. (모듈의 getSourceFileName()을 통해) 소스 코드 의 이름 을 추출하는 방법을 알고 있지만 절대 디렉토리 경로를 포함한 소스 코드의 전체 경로가 필요합니다. 어떻게 찾을 수 있습니까? 해결 방법이 있으면 그것도 작동합니다.
자, 여기서 제 질문에 답하겠습니다. LLVM이 내부적으로 절대 경로를 복원하는 방법은 IR/CodeGen/AsmWriter/AsmWriter.cpp:emitRemarksSection()
. 기본적으로 clang 이 현재 실행 중인 현재 경로로 소스 코드의 경로를 복원합니다 . 이를 수행하는 API 기능은 이미 LLVM에서 제공합니다.
이를 참고하여 모듈의 파일명을 전체 경로로 변환해 보겠습니다.
표준::문자열 파일 이름 = M.getSourceFileName();
char
벡터로 변환합니다 .llvm::SmallString<128> FilenameVec = StringRef(파일 이름);
llvm::sys::fs::make_absolute(파일명Vec);
파일 전체 경로는 에 바로 저장됩니다 FilenameVec
. llvm/Support/FileSystem.h
를 사용 하려면 를 포함 해야 합니다 make_absolute()
.
작동하는 IR 패스에 다음 코드를 (적절하게) 붙여서 시도해 볼 수 있습니다.
#include <string>
#include "llvm/Support/FileSystem.h"
...
std::string Filename = M.getSourceFileName(); // e.g., Filename = aaa.c
llvm::SmallString<128> FilenameVec = StringRef(Filename);
llvm::sys::fs::make_absolute(FilenameVec); // e.g., FilenameVec = /path/to/aaa.c
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다