zouquiong,
I think that the error with types. Check counter-access for for edge profile
as example:
uint32* ptr = key == 0 ? edgeProfile->getEntryCounter() :
edgeProfile->getCounter(key );
assert( ptr != NULL /*&& *ptr == 0 if compilation is locked*/);
Opnd* baseOpnd = irManager.newImmOpnd(typeManager.getUnmanagedPtrType(
typeManager.getUIntPtrType()), (POINTER_SIZE_INT)ptr);
Opnd* memOpnd = irManager.newMemOpnd(typeManager.getUIntPtrType(),
MemOpndKind_Heap, baseOpnd, NULL, NULL, NULL);
const Mnemonic mn = Mnemonic_ADD;
Inst* inst = irManager.newInst(mn, memOpnd, irManager.newImmOpnd(
typeManager.getUInt32Type(), 1));
The address of the counter has Pointer but but UInt32 type.
On 1/28/07, zouqiong <[EMAIL PROTECTED]> wrote:
I add the following expression in InstCodeSelector::addElemIndex():
Opnd* current_buffer = irManager.newImmOpnd(typeManager.getInt32Type(),
(unsigned)¤t_obj_acc_record_pointer);
Opnd * Ip_Opnd = irManager.newMemOpndAutoKind
(typeManager.getPrimitiveType(Type::UInt32),
current_buffer, irManager.newImmOpnd(typeManager.getInt32Type(), 8));
copyOpnd(Ip_Opnd, irManager.newImmOpnd(typeManager.getInt32Type(),
0x19820514));
It seems that the constraints of the Opnds are wrong. Is it?
current_obj_acc_record_pointer points to a buffer of type obj_acc_record
typedef struct {
uint32 base;
uint32 offset;
uint32 ip;
uint32 other_info;
}obj_acc_record;
--
Best Regards,
Qiong,Zou
--
Mikhail Fursov