2012-03-22 24 views
7

Tôi đang cố gắng phát hiện khai báo mảng và xây dựng bảng giá trị ký hiệu cho mảng có kích thước tĩnh. Nó sẽ chứa một cặp tên arraySize. Tôi có một số câu hỏi:LLVM Chỉ dẫn tên biến và tham số

1) Đưa ra hướng dẫn như% a = alloca [200 x i8], căn chỉnh 16 cách tôi có thể trích xuất "a", tên của mảng.

2) Tôi đang cố gắng để giải nén "200" như kích thước mảng nhưng mã này:

if(AllocaInst *allocInst = dyn_cast<AllocaInst>(&*I)){ 
    PointerType *p = allocInst->getType(); 
    if(p->getElementType()->isArrayTy()){ 
      Value* v = allocInst->getOperand(0); 
      errs() << *v ; 
    } 
}      

mang lại cho tôi "i32 1" khi tôi in v Có ai biết tại sao điều này là.? Tôi không nghĩ có bất cứ điều gì 32bit về điều này ngoại trừ có thể là địa chỉ.

+0

OK vì vậy tôi đã tìm ra cách để có được kích thước: ArrayType * a = cast (p-> getElementType()); a-> getNumElements() – Realn0whereman

+3

okay ... như vậy ... Tôi đã tìm ra cách để có được tên quá ... allocInst-> getName() Tại sao mà chỉ đơn giản đăng trên stackoverflow giúp tôi tìm câu trả lời nhanh hơn ...: P – Realn0whereman

+6

Tốt nhất là bạn chỉ cần đăng câu trả lời chứa thông tin này thay vì nhận xét. Bằng cách này, câu hỏi sẽ được đánh dấu đúng như đã trả lời. – Oak

Trả lời

2

Một số câu trả lời có trong nhận xét, nhưng dưới đây là giải thích đầy đủ hơn.

Có hai nguồn kích thước trong một alloca: kích thước của phân bổ loại và số phần tử thuộc loại được phân bổ. Nếu bạn không chỉ định một số rõ ràng, bạn sẽ nhận được mặc định ngầm định phân bổ một thành phần đơn . Đây là giá trị i32 1 bạn thoát khỏi toán hạng # 0. Nếu loại được phân bổ là loại mảng (sử dụng dyn_cast<...> để kiểm tra điều này, như cast<...> sẽ xác nhận), thì bạn cũng cần tính đến kích thước đó.

Trong LLVM, trình tối ưu hóa chuẩn hóa các lệnh alloca với kích thước tĩnh lớn hơn một hướng dẫn alloca của một mảng duy nhất có kích thước đó. Vì vậy, bạn thường thấy kích thước alloca như là một hằng số.

Có nhiều API thân thiện cho việc này cũng như: http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

Đặc biệt, AllocaInst::getArraySize() sẽ giúp bạn có số phần tử (thường là 1) và AllocaInst::getAllocatedType() sẽ giúp bạn có được kiểu của phần tử được phân bổ (đôi khi một mảng) .

Cuối cùng, lưu ý về việc sử dụng tên: LLVM không thực hiện bất kỳ nào đảm bảo về tên hướng dẫn. Các phần khác nhau của trình tối ưu hóa sẽ hủy các tên hoặc thay đổi chúng. Chỉ cần cẩn thận sử dụng chúng cho mã sản xuất vì bạn có thể ngạc nhiên khi chúng biến mất.

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