2016-07-12 5 views
5

나는 LLVM 3.4로 작업 중이며 IR에서 소스 파일의 행 번호 정보를 얻고 싶습니다. IR은 Clang과 간단한 c 코드로 생성됩니다. IR 본문의 라인에서 소스 C 파일의 라인 번호를 얻고 싶습니다. ;.ll 파일에서 소스 행 번호를 얻는 방법 LLVM

명령 BI를 들어
  1. , 부호 라인 = 라인 = 양방향> getDebugLoc()의 getline() -

    나는이 시도.

  2. For 루프 L, std :: cout < < L-> getStartLoc(). getLine();

결과는 항상 0입니다. LLVM IR에서 소스의 줄 번호를 얻는 방법을 모르겠습니다.

내 소스 C 파일입니다 -

#include <stdio.h> 

int main() 
{ 

int i; 

int inbuf[100]; 
int outbuf[100]; 

for(i = 0; i < 100; ++i)   
     inbuf[i] ^= outbuf[i]; 

inbuf[1] += 402; 
inbuf[6] += 107; 
inbuf[97] += 231; 

for(i = 0; i < 100; ++i)  
{ 
     inbuf[i] += outbuf[i]; 
} 

inbuf[47] += 312; 

    //print-statements 
for (i=0;i<100;i++) { 
     printf("inbuf[%d] = %d\n",i,inbuf[i]);    
} 

return 0; 

명령 Used- ~/LLVM/빌드/릴리스 + 어설/빈/그 소리 -03 -fno-풀다 - 루프 -fno-벡터화 -fno -slp-vectorize -S -emit-llvm sample.c -o sample.ll

고마워!

+0

그래서 소스 줄 번호 순서대로 입력 소스를 표현하기 위해 출력을 기대하는 이유가되지도 소스 코드 당 코드 덩어리가있을 것으로 기대하는 것입니다. llvm에 그 라이브러리를 채워주는 라이브러리가 있다면 그 라이브러리는 여러분이보고있는 것에 대한 라인이 없을 수도 있습니다. 어쩌면 최적화되지 않은 것을 시도해보고 변경 사항을 확인하십시오. –

+0

감사! -O0으로 시도했지만 여전히 0을 표시합니다. 명령 : ~/llvm/build/Release + Asserts/bin/clang -O0 -S -emit-llvm sample.c -o sample.ll 루프 및 지침을 감지하고 분석 할 수 있습니다. 함수 내부에서 사용하고 있습니다 - runOnLoop (Loop * L, LPPassManager & LPM) –

+0

컴파일 명령 줄에서 디버그 정보를 묻지 않는 것 같습니다. – Mat

답변

3

.ll 파일에 줄 번호 정보를 가져 오려면 clang에 -O0-g 플래그를 지정해야합니다.

http://llvm.org/docs/SourceLevelDebugging.html#debugging-optimized-code

줄 번호는 전문 메타 데이터 노드에 저장됩니다.

http://llvm.org/docs/LangRef.html#specialized-metadata-nodes

그래서 전체 명령 줄은 다음과 같이해야한다 : 당신은 최적화되어

~/llvm/build/Release+Asserts/bin/clang -O0 -g -S -emit-llvm sample.c -o sample.ll

+0

고마워요! -g를 추가하면 작동합니다. 먼저 플래그 -fstandalone-debug를 추가했습니다. 그러나 -g를 추가하면 -O0과 -O3 모두에서 작동합니다. 고마워요! :) –

+2

확실히 -O0은 필요 없습니다. 컬럼 정보를 원하면 -g, 아마도 -gcolumn-info를 원할 것입니다. -fstandalone-debug는 타입이 디버그 정보로 보내지는지 여부만을 제어합니다 - 우리가 클래스의 핵심 기능을 내놓을 때마다 우리가 핵심 기능을 방출하지 않는다면 타입을 최적화 할 것입니다. 디버그 정보가 있는지 확인하십시오. – echristo

+0

정확히! 모든 정보에 대해 @echristo에게 감사드립니다. –