7.42 Calling a nonvirtual member function

The following example shows code that calls a nonvirtual function in either a virtual or nonvirtual base.

// rp contains a D* and we want to do the equivalent of rp->f() where f is a
// nonvirtual function
// all arguments other than the this pointer are already set up
// assumes f does not return a struct
 if __mcall_is_in_vbase(D, f)
   LDR r12, [rp]                                   // fetch vtable pointer
   LDR r0, [r12, #-__mcall_offsetof_vbase(D, f)]   // fetch the vbase offset
   ADD r0, r0, rp                                  // do this adjustment
   ADD r0, rp, #__mcall_this_offset(D, f)          // set up and adjust this
                                                   // pointer for D*
   BL __cpp(&D::f)                                 // call D::f
Non-ConfidentialPDF file icon PDF versionARM DUI0472M
Copyright © 2010-2016 ARM Limited or its affiliates. All rights reserved.