2012-11-13 37 views
5

Tôi đã tìm kiếm hàng giờ và tôi không thể tìm thấy bất kỳ thứ gì có thể giúp tôi. Tôi đang làm việc trên một dự án liên quan đến một FunctionPass. Tôi đã thực hiện một phương thức runOnFunction (Function & f) và nó hoạt động tốt. Về cơ bản nó cần phải:Làm thế nào để chèn một chỉ dẫn LLVM?

1) Phát hiện một cửa hàng hướng dẫn

2) Chuyển đổi địa chỉ bộ nhớ của hướng dẫn cửa hàng để một Integer

3) Thay đổi số nguyên sử dụng một phép toán AND hoạt động (0000FFFF)

4) Chuyển đổi số nguyên trở lại con trỏ

Cho đến nay tôi đã có những điều sau đây:

virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) { 
    BasicBlock& b = *bb; 
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) { 
     if(StoreInst *si = dyn_cast<StoreInst>(&*i)) { 
     PtrToIntInst* ptrToInt = new PtrToIntInst(si->getPointerOperand(), IntegerType::get(si->getContext(), 32), "", si); 
     } 
    } 
    } 
    return true; 
} 

Tôi không thể cho cuộc sống của tôi tìm ra cách để thực sự chèn các hướng dẫn, hoặc thậm chí tìm một cách để tạo ra một hướng dẫn và. Nếu bất cứ ai có thể chỉ cho tôi đi đúng hướng, điều đó thật tuyệt.

Xin cảm ơn trước.

Trả lời

4

Tôi khuyên bạn nên xem qua số Programmer's Manual - nó có phạm vi phủ sóng khá cơ bản về các khái niệm cơ bản.

Cụ thể, có a section about creating and inserting new instructions. Cách đơn giản nhất là chỉ cung cấp hướng dẫn hiện có làm đối số cuối cùng cho hàm tạo của lệnh mới, sau đó sẽ chèn lệnh đó ngay trước lệnh hiện có.

Hoặc, bạn có thể vượt qua khối cơ bản kèm theo nếu bạn chỉ muốn thêm vào cuối của nó (nhưng hãy nhớ rằng bạn cần phải chăm sóc các terminator!). Cuối cùng, bạn chỉ có thể gọi getInstList() trên khối cơ bản kèm theo, sau đó insert hoặc push_back để chèn hướng dẫn mới tại đó.

Là một sang một bên, bạn không phải lặp qua tất cả các khối và sau đó trên tất cả các hướng dẫn trong mỗi khối, bạn chỉ có thể lặp qua các hướng dẫn trực tiếp; xem the section about the instruction iterator in the programmer's manual.

+0

Làm thế nào để bạn chăm sóc người kết thúc trong trường hợp đi qua một khối cơ bản kèm theo? – PatoBeltran

+1

@PatoBeltran Thêm hướng dẫn theo cách không kích hoạt xác minh khối cơ bản, do đó bạn có thể có khối cơ bản không đúng định dạng trong các giai đoạn trung gian đó. Chỉ cần chắc chắn để đặt một terminator ở cuối trước khi bạn kết thúc với chức năng vượt qua của bạn. – Oak

4
virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) { 
    BasicBlock &b = *bb; 
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) { 
     if (StoreInst *si = dyn_cast<StoreInst>(&*i)) { 
     IRBuilder Builder(si); 
     Value *StoreAddr = Builder.CreatePtrToInt(si->getPointerOperand(), Builder.getInt32Ty()); 
     Value *Masked = Builder.CreateAnd(StoreAddr, 0xffff); 
     Value *AlignedAddr = Builder.CreateIntToPtr(Masked, si->getPointerOperand()->getType()); 
     // ... 
     } 
    } 
    } 
    return true; 
} 
0

Bạn có thể sử dụng IRBuilder để dễ dàng chèn hướng dẫn mới trước hướng dẫn khác hoặc ở cuối khối cơ bản.

Ngoài ra, nếu bạn cần để chèn một lệnh sau nhau, bạn cần phải sử dụng instruction list trong khối cơ bản bao gồm:

BasicBlock *pb = ...; 
Instruction *pi = ...; 
Instruction *newInst = new Instruction(...); 

pb->getInstList().insertAfter(pi, newInst); 

Mã và giải pháp lấy từ here.

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