2016-07-12 12 views
5

Tôi đang làm việc với LLVM 3.4 và muốn lấy thông tin về số dòng của tệp nguồn từ IR. IR được tạo ra từ mã c đơn giản với Clang. Tôi muốn lấy số dòng trong tệp c nguồn từ dòng trong thân IR.Cách lấy số dòng nguồn từ tệp .ll LLVM

Tôi cố gắng này -

  1. Đối với Chỉ thị BI, unsigned Line = Dòng = song phương> getDebugLoc() getline();.
  2. Đối với vòng lặp L, std :: cout < < L-> getStartLoc(). GetLine();

Nhưng, kết quả được lưu trữ/in luôn là 0. Tôi không biết cách lấy số dòng trong nguồn từ LLVM IR.

tập tin C Nguồn của tôi là -

#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; 

lệnh sử dụng- ~/llvm/build/Release + Khẳng định/bin/kêu vang O3 -fno-tháo vật cuộn tròn lại, vòng -fno-vectorize -fno -slp-vectorize -S -emit-llvm mẫu.c -o sample.ll

Cảm ơn!

+0

Bạn đang tối ưu hóa vì vậy không có lý do gì để mong đợi đầu ra để đại diện cho nguồn đầu vào phù hợp nguồn trật tự số cũng không để mong đợi có một đoạn mã trên mỗi dòng mã nguồn. Nếu llvm có một thư viện mà điền vào những người và đó là những gì bạn đang yêu cầu có thể không có dòng cho điều bạn đang tìm kiếm. có thể thử unoptimized và xem nếu điều đó thay đổi mọi thứ. –

+0

Cảm ơn! Tôi đã thử với -O0 nhưng Nó vẫn hiển thị 0. lệnh: ~/llvm/build/Release + Asserts/bin/clang -O0 -S -emit-llvm sample.có mẫu.ll Tôi đã vượt qua có thể phát hiện và phân tích các vòng lặp và hướng dẫn. Tôi đang sử dụng nó bên trong hàm - runOnLoop (Loop * L, LPPassManager & LPM) –

+0

Bạn dường như không yêu cầu thông tin gỡ lỗi trong dòng lệnh biên dịch của bạn. – Mat

Trả lời

3

Để nhận thông tin số dòng vào tệp .ll, bạn phải chỉ định cả cờ -O0-g cho cờ.

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

Số dòng được lưu trữ trong các nút siêu dữ liệu chuyên biệt.

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

Vì vậy, các dòng lệnh đầy đủ phải trông như thế này:

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

+0

Cảm ơn! Thêm -g hoạt động. Trước tiên tôi đã thêm cờ-debug độc lập. Nhưng, thêm -g làm việc với cả hai -O0 và -O3. Cảm ơn rất nhiều! :) –

+2

Bạn chắc chắn không cần -O0. Bạn chắc chắn sẽ muốn -g, có lẽ ngay cả -gcolumn-info nếu bạn muốn thông tin cột. -falonealone-debug chỉ kiểm soát xem một kiểu có được phát ra trong thông tin gỡ lỗi hay không - thông thường chúng ta sẽ tối ưu hóa kiểu nếu chúng ta không phát ra hàm quan trọng trên ý tưởng cho dù chúng ta phát ra một hàm khóa nào cho lớp chúng ta ' sẽ đảm bảo thông tin gỡ lỗi ở đó. – echristo

+0

Chính xác! Cảm ơn @echristo vì tất cả thông tin. –

Các vấn đề liên quan