나는 입력 파일 (.ll)을 LLVM에 의해 파서 드하고 싶습니다. 따라서 프로그램의 메모리 내 표현을 생성합니다. 그리고 나서 unparsed하고 stdout으로 덤핑되어야합니다. 그러나 생성 된 AST에서 덤프해야합니다. . 나는 부분적으로 성공한다. LLVM은 프로그램을 구문 분석하고 모듈을 표준 출력으로 덤프합니다. 그러나 원본 소스 코드의 형식이 유지됩니다. LLVM이 실제로 모듈을 덤프하기 위해 AST를 파싱하지 않았다고 생각할 수 있습니다. 대신 LLVM이 메모리 내 AST와 함께 텍스트 표현을 저장하고, 변경되지 않은 경우이 텍스트 표현을 덤프하는 것이 좋습니다 , 그것은 내가 원하는 것이 아닙니다. 왜 모듈을 덤핑 할 때 보존 원래의 소스 코드의 형식이며, LLVM 프로그램의 텍스트 표현을 삭제하고 AST unparse 사실을 가지고 있는지 확인하는 방법은 무엇입니까 :LLVM이 AST를 파싱하지 않도록 강제하는 방법은 무엇입니까?
std::cout << "Reading IR ...\n";
LLVMContext &Context = getGlobalContext();
SMDiagnostic Err;
Module *Mod = ParseIRFile(argv[1], Err, Context);
if (!Mod) {
std::cerr << "Problems reading IR\n";
return 1;
}
Mod->dump();
내 질문은 ?
그냥 이론이지만 일부 도구는 종종 할 일이 옳기 때문에 "라운드 트립"을 위해 할 수있는 모든 것을 보존하도록 설계되었습니다. 그렇다고해서 AST에서 세대가 발생하지 않았다는 의미는 아닙니다. 경험이 없지만 AST에서 볼 수있는 것보다 더 많은 것이 있거나 출력측이 원본 소스를 다시 참조 함을 의미합니다. AST뿐만 아니라 어쨌든 출력물에 원하는 내용이 정확히 포함되도록하려면 AST를 먼저 복제하는 방법이 있습니다. 원하는 노드와 세부 사항 만 복사하고 링크를 소스로 되돌릴 수 있습니다. – Steve314
아마도 좋은 방법은 아니지만, 원하는 AST 노드에 대한 지식이 완벽 할뿐만 아니라 완벽한 상태로 유지 될 것이라는 가정하에 새로운 LLVM 버전을 사용하는 새로운 AST 노드 유형도 쉽게 눈에 띄지 않을 수 있습니다. – Steve314
흥미로운 질문입니다! 모듈 덤프가 포맷팅을 유지한다는 사실을 전혀 몰랐습니다. 어떻게 보이는지 예제를 첨부 할 수 있습니까? 또한주의 사항 : IR을 파싱 할 때 AST가 사용되는 동안 LLVM IR 자체는 AST가 아니며 '모듈'에는 트리가 숨겨져 있지 않습니다. – Oak