[LLVMbugs] [Bug 18917] New: MS ABI: Pointers to virtual member functions in non-primary vftables need to include offset to vfptr
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Thu Feb 20 18:02:38 PST 2014
http://llvm.org/bugs/show_bug.cgi?id=18917
Bug ID: 18917
Summary: MS ABI: Pointers to virtual member functions in
non-primary vftables need to include offset to vfptr
Product: clang
Version: unspecified
Hardware: PC
OS: Windows NT
Status: NEW
Severity: normal
Priority: P
Component: LLVM Codegen
Assignee: unassignedclangbugs at nondot.org
Reporter: rnk at google.com
CC: llvmbugs at cs.uiuc.edu
Blocks: 12477, 18887
Classification: Unclassified
We currently miscompile this code:
struct A {
virtual int f() { return a; }
int a;
};
struct B {
virtual int g() { return b; }
int b;
};
struct C : A, B {
virtual int g() { return c; }
int c;
};
int call_mp(C &c, int (C::*mp)()) {
return (c.*mp)();
}
int main() {
C c;
c.a = 1;
c.b = 2;
c.c = 3;
int (C::*mp)() = &C::g;
return call_mp(c, mp);
}
When we take the address of &C::g, we should give a 'this' adjustment of zero
because we assume that the user will supply a C* and that the thunk expects
this to point to the complete object. MSVC disagrees.
MSVC's thunks expect 'this' to point to the vfptr that holds the virtual method
in question. The thunk then loads from the vftable and jumps. Therefore, that
adjustment has to be part of the member pointer, so mp in this example needs a
non-virtual this adjustment of 8.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140221/73db6ec0/attachment.html>
More information about the llvm-bugs
mailing list