2012-08-26 34 views
6

Tôi mới tham gia LLVM. Tôi đang cố gắng để viết một Pass cơ bản sẽ kiểm tra các đối số của một cuộc gọi printf, khi nó được đưa ra Đại diện trung gian.
Nếu chuỗi định dạng không phải là chuỗi chữ, thì dĩ nhiên tôi không thể kiểm tra nó. Nhưng khá thường xuyên, nó được.Làm thế nào để nhận được giá trị của một chuỗi chữ trong LLVM IR?

Các IR mẫu tôi đang cố gắng để kiểm tra là:

@.str = private unnamed_addr constant [7 x i8] c"Hi %u\0A\00", align 1 

define i32 @main() nounwind { 
entry: 
    %retval = alloca i32, align 4 
    store i32 0, i32* %retval 
    %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0), i32 1) 
    ret i32 0 
} 

declare i32 @printf(i8*, ...) 

Tôi tìm thấy đèo tồn tại trước đó gọi là ExternalFunctionsPassedConstants, mà dường như có liên quan:

struct ExternalFunctionsPassedConstants : public ModulePass { 
    static char ID; // Pass ID, replacement for typeid 
    ExternalFunctionsPassedConstants() : ModulePass(ID) {} 
    virtual bool runOnModule(Module &M) { 
    for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 
     if (!I->isDeclaration()) continue; 

     bool PrintedFn = false; 
     for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); 
      UI != E; ++UI) { 
     Instruction *User = dyn_cast<Instruction>(*UI); 
     if (!User) continue; 

     CallSite CS(cast<Value>(User)); 
     if (!CS) continue; 

     ... 

Vì vậy, tôi đã thêm mã:

 if (I->getName() == "printf") { 
      errs() << "printf() arg0 type: " 
       << CS.getArgument(0)->getType()->getTypeID() << "\n"; 
     } 

Cho đến nay, rất tốt - Tôi thấy rằng ID loại là 14, có nghĩa là đó là PointerTyID.

Nhưng bây giờ, làm cách nào để nhận được nội dung của chuỗi ký tự được chuyển làm đối số, vì vậy tôi có thể xác thực số đối số dự kiến ​​dựa trên số thực tế đã đưa ra?

Trả lời

6
CS.getArgument(0) 

đại diện cho GetElementPtrConstantExpr

i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0) 

, nó là một đối tượng người dùng. Chuỗi bạn muốn (tức là @ .str) là toán hạng đầu tiên của GetElementPtrConstantExpr.

Vì vậy, bạn có thể nhận được các chuỗi chữ qua

CS.getArgument(0).getOperand(0) 

Tuy nhiên, tôi đã không kiểm tra mã này. Nếu có bất kỳ sai lầm, xin vui lòng cho tôi biết.

+2

Oh tuyệt vời! 'getOperand' chỉ cho tôi đúng hướng! Có vẻ như tôi cần 'cast (cast (cast (CS.getArgument (0)) -> getOperand (0)) -> getInitializer()) -> getAsCString()', mang lại cho tôi chuỗi. :) Cảm ơn bạn rất nhiều! – Mehrdad

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