6.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
Related concepts
6.26 Embedded assembler support in the compiler
6.41 Calling nonstatic member functions in embedded assembler
6.43 Calling a virtual member function
Non-ConfidentialPDF file icon PDF versionARM DUI0375F
Copyright © 2007, 2008, 2011, 2012, 2014 ARM. All rights reserved.