Author: rsmith Date: Mon Feb 8 19:05:04 2016 New Revision: 260181 URL: http://llvm.org/viewvc/llvm-project?rev=260181&view=rev Log: Fix undefined behavior when compiling in C++14 due to sized operator delete being called with the wrong size: convert CGFunctionInfo to use TrailingObjects and ask TrailingObjects to provide a working 'operator delete' for us.
Modified: cfe/trunk/include/clang/CodeGen/CGFunctionInfo.h cfe/trunk/lib/CodeGen/CGCall.cpp Modified: cfe/trunk/include/clang/CodeGen/CGFunctionInfo.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/CodeGen/CGFunctionInfo.h?rev=260181&r1=260180&r2=260181&view=diff ============================================================================== --- cfe/trunk/include/clang/CodeGen/CGFunctionInfo.h (original) +++ cfe/trunk/include/clang/CodeGen/CGFunctionInfo.h Mon Feb 8 19:05:04 2016 @@ -20,6 +20,7 @@ #include "clang/AST/CharUnits.h" #include "clang/AST/Type.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/Support/TrailingObjects.h" #include <cassert> namespace llvm { @@ -331,13 +332,19 @@ public: } }; +// Implementation detail of CGFunctionInfo, factored out so it can be named +// in the TrailingObjects base class of CGFunctionInfo. +struct CGFunctionInfoArgInfo { + CanQualType type; + ABIArgInfo info; +}; + /// CGFunctionInfo - Class to encapsulate the information about a /// function definition. -class CGFunctionInfo : public llvm::FoldingSetNode { - struct ArgInfo { - CanQualType type; - ABIArgInfo info; - }; +class CGFunctionInfo final + : public llvm::FoldingSetNode, + private llvm::TrailingObjects<CGFunctionInfo, CGFunctionInfoArgInfo> { + typedef CGFunctionInfoArgInfo ArgInfo; /// The LLVM::CallingConv to use for this function (as specified by the /// user). @@ -374,13 +381,17 @@ class CGFunctionInfo : public llvm::Fold unsigned ArgStructAlign; unsigned NumArgs; + ArgInfo *getArgsBuffer() { - return reinterpret_cast<ArgInfo*>(this+1); + return getTrailingObjects<ArgInfo>(); } const ArgInfo *getArgsBuffer() const { - return reinterpret_cast<const ArgInfo*>(this + 1); + return getTrailingObjects<ArgInfo>(); } + size_t numTrailingObjects(OverloadToken<ArgInfo>) { return NumArgs + 1; } + friend class TrailingObjects; + CGFunctionInfo() : Required(RequiredArgs::All) {} public: @@ -391,6 +402,7 @@ public: CanQualType resultType, ArrayRef<CanQualType> argTypes, RequiredArgs required); + void operator delete(void *p) { TrailingObjects::operator delete(p); } typedef const ArgInfo *const_arg_iterator; typedef ArgInfo *arg_iterator; Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=260181&r1=260180&r2=260181&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Feb 8 19:05:04 2016 @@ -569,8 +569,7 @@ CGFunctionInfo *CGFunctionInfo::create(u CanQualType resultType, ArrayRef<CanQualType> argTypes, RequiredArgs required) { - void *buffer = operator new(sizeof(CGFunctionInfo) + - sizeof(ArgInfo) * (argTypes.size() + 1)); + void *buffer = operator new(totalSizeToAlloc<ArgInfo>(argTypes.size() + 1)); CGFunctionInfo *FI = new(buffer) CGFunctionInfo(); FI->CallingConvention = llvmCC; FI->EffectiveCallingConvention = llvmCC; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits