2013-05-08 1 views
1

나는 입력 파일 (.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(); 

내 질문은 ?

+0

그냥 이론이지만 일부 도구는 종종 할 일이 옳기 때문에 "라운드 트립"을 위해 할 수있는 모든 것을 보존하도록 설계되었습니다. 그렇다고해서 AST에서 세대가 발생하지 않았다는 의미는 아닙니다. 경험이 없지만 AST에서 볼 수있는 것보다 더 많은 것이 있거나 출력측이 원본 소스를 다시 참조 함을 의미합니다. AST뿐만 아니라 어쨌든 출력물에 원하는 내용이 정확히 포함되도록하려면 AST를 먼저 복제하는 방법이 있습니다. 원하는 노드와 세부 사항 만 복사하고 링크를 소스로 되돌릴 수 있습니다. – Steve314

+0

아마도 좋은 방법은 아니지만, 원하는 AST 노드에 대한 지식이 완벽 할뿐만 아니라 완벽한 상태로 유지 될 것이라는 가정하에 새로운 LLVM 버전을 사용하는 새로운 AST 노드 유형도 쉽게 눈에 띄지 않을 수 있습니다. – Steve314

+0

흥미로운 질문입니다! 모듈 덤프가 포맷팅을 유지한다는 사실을 전혀 몰랐습니다. 어떻게 보이는지 예제를 첨부 할 수 있습니까? 또한주의 사항 : IR을 파싱 할 때 AST가 사용되는 동안 LLVM IR 자체는 AST가 아니며 '모듈'에는 트리가 숨겨져 있지 않습니다. – Oak

답변

1

모듈을 덤프하면 포맷팅이 유지된다는 것을 결코 알지 못하기 때문에 다시 확인해야합니다. 내가 아는 바로는, 그렇게해서는 안됩니다.

또한 IR을 구문 분석 할 때 AST가 사용될 수도 있지만 LLVM IR 자체는 AST가 아니며 모듈에 트리가 숨겨져 있지 않습니다.

3

IR 파서 서식을 유지하지 않습니다. 이렇게하는 데는 아무런 의미가 없습니다. 그것은 모듈을 stdout에 덤프하는 데 사용되는 IR 작성기 일 뿐이며 .ll 파일로 덤프하는 데 사용되는 것과 정확하게 동일합니다. 그래서, 덤프에서 입력 .ll 파일과 비교할 때 항상 동일한 형식을 갖습니다.

관련 문제