From 68e3013ade8a219625b636bb8c1dcec2ba6fb685 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Wed, 5 May 2010 05:47:36 +0000 Subject: [PATCH] Use a more appropriate LLVM type for the vtable pointer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103078 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGRecordLayoutBuilder.cpp | 8 +++++--- test/CodeGenCXX/class-layout.cpp | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index 6302cf8d1f..0966678f3e 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -439,12 +439,14 @@ void CGRecordLayoutBuilder::LayoutBases(const CXXRecordDecl *RD, const ASTRecordLayout &Layout) { // Check if we need to add a vtable pointer. if (RD->isDynamicClass() && !Layout.getPrimaryBase()) { - const llvm::Type *Int8PtrTy = - llvm::Type::getInt8PtrTy(Types.getLLVMContext()); + const llvm::Type *FunctionType = + llvm::FunctionType::get(llvm::Type::getInt32Ty(Types.getLLVMContext()), + /*isVarArg=*/true); + const llvm::Type *VTableTy = FunctionType->getPointerTo(); assert(NextFieldOffsetInBytes == 0 && "VTable pointer must come first!"); - AppendField(NextFieldOffsetInBytes, Int8PtrTy->getPointerTo()); + AppendField(NextFieldOffsetInBytes, VTableTy->getPointerTo()); } } diff --git a/test/CodeGenCXX/class-layout.cpp b/test/CodeGenCXX/class-layout.cpp index 31091c5f45..9303bdaba8 100644 --- a/test/CodeGenCXX/class-layout.cpp +++ b/test/CodeGenCXX/class-layout.cpp @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -// An extra byte shoudl be allocated for an empty class. +// An extra byte should be allocated for an empty class. // CHECK: %struct.A = type { i8 } struct A { } a; @@ -9,5 +9,5 @@ struct A { } a; struct B { void *a; int b; } b; // C should have a vtable pointer. -// CHECK: %struct.C = type { i8**, i32 } +// CHECK: %struct.C = type { i32 (...)**, i32 } struct C { virtual void f(); int a; } *c; -- 2.40.0