2012-09-13 4 views
1

저는 LLVM을 수정하여 메모리에서 특정 상수와 함수를 연속적으로 유지하려고합니다.
다른 말로하면, 특정 기능의 기계 코드가 일 때 항상에 메모리의 ~ 4 바이트 상수가 선행되어 있는지 확인해야합니다. 함수 본문 자체를 수정하면 안됩니다.LLVM IR에서 전역 변수의 위치를 ​​제어하는 ​​방법은 무엇입니까?

어떻게하면 LLVM IR을 수정하여이 작업을 수행 할 수 있습니까?

  • 예 경우 : I 변수와 메모리에서 함수의 연속을 유지하기 위해 LLVM IR에 명시 할 방법 ?

  • 아니요 : 코드 생성 과정에서 어떤 부분을 수정해야합니까? 보아야 할 프로젝트/파일에 대한 링크는 도움이 될 것입니다. 왜냐하면 어디서부터 시작해야할지 모르겠습니다.

+0

이것은 분명히 x86과 같은 Harvard 아키텍처에서는 작동하지만 Atmel과 같은 Harvard 아키텍처에서는 이것이 의미가 없습니다. 코드 앞에 오는 바이트도 코드입니다. 데이터 뒤의 바이트도 데이터입니다. LLVM은 하버드 아키텍처를 지원할만큼 충분히 휴대가 편리하다고 생각합니다. – MSalters

+0

@MSalters : 그렇습니다. 그렇다고 하버드 이외의 아키텍처에서는 사용할 수 없습니다. 결국 플랫폼 특유의 기능을 가지고 있지는 않습니다 (SSE 등). :) 그러나 당신이 이것을 지원하지 않는다는 사실을 안다면 대답으로 게시하십시오! – Mehrdad

+0

GHC의 TNTC 최적화와 관련이 있습니까? – arrowd

답변

0

내가 아는 한, 나는 IR을 수정함으로써 그렇게 할 수 있다고 생각하지 않는다. 당신은 그것을 처리 할 무언가를 써야합니다. 패스가되어서는 안됩니다. 너무 낮은 레벨이므로 target-specific code generation 중에 실행해야합니다. 기존 타겟을 피기 백 (piggyback)하고이 aspect를 수정하는 것은 물론, 새로운 타겟을 처음부터 작성할 필요가 없습니다. 그래도 어느 위치가 정확히 좋을지는 모르겠다.

코드 생성 중에 IR 수준에서 DAG로이 정보를 전달하는 좋은 방법은 메타 데이터를 사용하는 것입니다. 메타 데이터를 함수 또는 관련 상수에 연결하여 서로 연결하고 나중에 그것들을 함께 방출하기 위해 그 링크를 사용하십시오. this thread on llvm-dev for information how to transfer the metadata을 참조하십시오.