On Sun, Feb 15, 2015 at 6:10 PM, Richard Smith <[email protected]> wrote:
> On Fri, Feb 13, 2015 at 9:42 PM, Larisse Voufo <[email protected]> wrote: > >> Author: lvoufo >> Date: Fri Feb 13 23:42:57 2015 >> New Revision: 229241 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=229241&view=rev >> Log: >> Revise the implementation logic of sized deallocation: Do not >> automatically generate weak definitions of the sized operator delete (in >> terms of unsized operator delete). Instead, provide the funcitonality via a >> new compiler flag, -fdef-sized-delete. >> The current implementation causes link-time ODR violations when the >> delete symbols are exported into the dynamic table. >> >> Modified: >> cfe/trunk/include/clang/Basic/LangOptions.def >> cfe/trunk/include/clang/Driver/Options.td >> cfe/trunk/lib/CodeGen/CodeGenFunction.cpp >> cfe/trunk/lib/CodeGen/CodeGenModule.cpp >> cfe/trunk/lib/Driver/Tools.cpp >> cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp >> cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp >> >> Modified: cfe/trunk/include/clang/Basic/LangOptions.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/LangOptions.def (original) >> +++ cfe/trunk/include/clang/Basic/LangOptions.def Fri Feb 13 23:42:57 2015 >> @@ -162,6 +162,7 @@ LANGOPT(CUDAIsDevice , 1, 0, "Compi >> >> LANGOPT(AssumeSaneOperatorNew , 1, 1, "implicit __attribute__((malloc)) >> for C++'s new operators") >> LANGOPT(SizedDeallocation , 1, 0, "enable sized deallocation functions") >> +LANGOPT(DefaultSizedDelete , 1, 0, "Generate weak definitions of sized >> delete") >> > > Please start this string with a lowercase letter. How about > DefineSizedDeallocation, to match the existing SizedDeallocation LangOpt? > ("Define" seems like a better word than "Default" here in any case.) > > >> BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision") >> BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd >> records") >> BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of >> IRgen'd records in a simple form") >> >> Modified: cfe/trunk/include/clang/Driver/Options.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Driver/Options.td (original) >> +++ cfe/trunk/include/clang/Driver/Options.td Fri Feb 13 23:42:57 2015 >> @@ -394,6 +394,8 @@ def fasm_blocks : Flag<["-"], "fasm-bloc >> def fno_asm_blocks : Flag<["-"], "fno-asm-blocks">, Group<f_Group>; >> >> def fassume_sane_operator_new : Flag<["-"], >> "fassume-sane-operator-new">, Group<f_Group>; >> +def fdef_sized_delete: Flag<["-"], "fdef-sized-delete">, Group<f_Group>, >> + HelpText<"Allow compiler-generated definition of sized deallocation >> function">, Flags<[CC1Option]>; >> > > Likewise here, how about -fdefine-sized-deallocation, to match the > existing -fsized-deallocation flag? > Thanks, Richard. Please see r229597 for the above comments. > > def fastcp : Flag<["-"], "fastcp">, Group<f_Group>; >> def fastf : Flag<["-"], "fastf">, Group<f_Group>; >> def fast : Flag<["-"], "fast">, Group<f_Group>; >> >> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Fri Feb 13 23:42:57 2015 >> @@ -891,8 +891,11 @@ void CodeGenFunction::GenerateCode(Globa >> } else if (FunctionDecl *UnsizedDealloc = >> >> FD->getCorrespondingUnsizedGlobalDeallocationFunction()) { >> // Global sized deallocation functions get an implicit weak >> definition if >> - // they don't have an explicit definition. >> + // they don't have an explicit definition, if allowed. >> + assert(getLangOpts().DefaultSizedDelete && >> + "Can't emit unallowed definition."); >> EmitSizedDeallocationFunction(*this, UnsizedDealloc); >> + >> } else >> llvm_unreachable("no definition for emitted function"); >> >> >> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Feb 13 23:42:57 2015 >> @@ -1615,13 +1615,13 @@ CodeGenModule::GetOrCreateLLVMFunction(S >> // don't need it anymore). >> addDeferredDeclToEmit(F, DDI->second); >> DeferredDecls.erase(DDI); >> - >> + >> // Otherwise, if this is a sized deallocation function, emit a weak >> - // definition >> - // for it at the end of the translation unit. >> + // definition for it at the end of the translation unit. >> } else if (D && cast<FunctionDecl>(D) >> >> ->getCorrespondingUnsizedGlobalDeallocationFunction()) { >> - addDeferredDeclToEmit(F, GD); >> + if (getLangOpts().DefaultSizedDelete) >> + addDeferredDeclToEmit(F, GD); >> >> // Otherwise, there are cases we have to worry about where we're >> // using a declaration for which we must emit a definition but >> where >> >> Modified: cfe/trunk/lib/Driver/Tools.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Driver/Tools.cpp (original) >> +++ cfe/trunk/lib/Driver/Tools.cpp Fri Feb 13 23:42:57 2015 >> @@ -4243,6 +4243,11 @@ void Clang::ConstructJob(Compilation &C, >> if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, >> options::OPT_fno_assume_sane_operator_new)) >> CmdArgs.push_back("-fno-assume-sane-operator-new"); >> + >> + // -def-sized-delete: default implementation of sized delete as a >> + // weak definition. >> + if (Args.hasArg(options::OPT_fdef_sized_delete)) >> + CmdArgs.push_back("-fdef-sized-delete"); >> >> // -fconstant-cfstrings is default, and may be subject to argument >> translation >> // on Darwin. >> >> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) >> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Feb 13 23:42:57 2015 >> @@ -1525,6 +1525,8 @@ static void ParseLangArgs(LangOptions &O >> Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin); >> Opts.AssumeSaneOperatorNew = >> !Args.hasArg(OPT_fno_assume_sane_operator_new); >> Opts.SizedDeallocation |= Args.hasArg(OPT_fsized_deallocation); >> + Opts.DefaultSizedDelete = Opts.SizedDeallocation && >> + Args.hasArg(OPT_fdef_sized_delete); >> Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); >> Opts.AccessControl = !Args.hasArg(OPT_fno_access_control); >> Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); >> >> Modified: cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp (original) >> +++ cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp Fri Feb 13 >> 23:42:57 2015 >> @@ -1,5 +1,7 @@ >> -// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o >> - | FileCheck %s >> -// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple >> x86_64-linux-gnu -o - | FileCheck %s >> +// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o >> - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND >> +// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu >> -fdef-sized-delete -o - | FileCheck %s --check-prefix=CHECK >> --check-prefix=CHECKDEF >> +// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple >> x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK >> --check-prefix=CHECKUND >> +// RUN: %clang_cc1 -std=c++11 -fsized-deallocation -fdef-sized-delete %s >> -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s >> --check-prefix=CHECK --check-prefix=CHECKDEF >> // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o >> - | FileCheck %s --check-prefix=CHECK-UNSIZED >> >> // CHECK-UNSIZED-NOT: _ZdlPvm >> @@ -50,8 +52,9 @@ D::D() {} >> // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) >> // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) >> >> -// CHECK-LABEL: define linkonce void @_ZdlPvm(i8* >> -// CHECK: call void @_ZdlPv(i8* %0) >> +// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8* >> +// CHECKDEF: call void @_ZdlPv(i8* %0) >> +// CHECKUND-LABEL: declare void @_ZdlPvm(i8* >> >> // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv() >> // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) >> @@ -71,8 +74,9 @@ D::D() {} >> // CHECK: add i64 %{{[^ ]*}}, 8 >> // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) >> >> -// CHECK-LABEL: define linkonce void @_ZdaPvm(i8* >> -// CHECK: call void @_ZdaPv(i8* %0) >> +// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8* >> +// CHECKDEF: call void @_ZdaPv(i8* %0) >> +// CHECKUND-LABEL: declare void @_ZdaPvm(i8* >> >> // CHECK-LABEL: define weak_odr void @_Z3delI1DEvv() >> // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8) >> >> Modified: cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp?rev=229241&r1=229240&r2=229241&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp (original) >> +++ cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp Fri Feb >> 13 23:42:57 2015 >> @@ -1,7 +1,9 @@ >> // RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++11 %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF >> -check-prefix=CHECK11 >> // RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++11 -fvisibility hidden %s 2>&1 | FileCheck %s >> -check-prefix=CHECKHID -check-prefix=CHECK11 >> -// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++14 %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF >> -check-prefix=CHECK14 >> -// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++14 -fvisibility hidden %s 2>&1 | FileCheck %s >> -check-prefix=CHECKHID -check-prefix=CHECK14 >> +// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++14 %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF >> -check-prefix=CHECK14 -check-prefix=CHECK14UND >> +// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++14 -fvisibility hidden %s 2>&1 | FileCheck %s >> -check-prefix=CHECKHID -check-prefix=CHECK14 -check-prefix=CHECK14UND >> +// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++14 -fdef-sized-delete %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF >> -check-prefix=CHECK14 -check-prefix=CHECK14DEF >> +// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - >> -std=c++14 -fdef-sized-delete -fvisibility hidden %s 2>&1 | FileCheck %s >> -check-prefix=CHECKHID -check-prefix=CHECK14 -check-prefix=CHECK14DEF >> >> // PR22419: Implicit sized deallocation functions always have default >> visibility. >> // Generalized to all implicit allocation functions. >> @@ -27,8 +29,9 @@ void foo(A* is) { >> // CHECK11-DAG: declare void @_ZdlPv(i8*) >> >> // CHECK14-DAG: declare noalias i8* @_Znwm(i64) >> -// CHECK14-DAG: define linkonce void @_ZdlPvm(i8*, i64) >> -// CHECK14-DAG: declare void @_ZdlPv(i8*) >> +// CHECK14UND-DAG: declare void @_ZdlPvm(i8*, i64) >> +// CHECK14DEF-DAG: define linkonce void @_ZdlPvm(i8*, i64) >> +// CHECK14DEF-DAG: declare void @_ZdlPv(i8*) >> >> // CHECK14-DAG: %struct.B = type { i8 } >> struct B { ~B() { }}; >> @@ -50,5 +53,6 @@ void f(B *p) { >> // CHECK11-DAG: declare void @_ZdaPv(i8*) >> >> // CHECK14-DAG: declare noalias i8* @_Znam(i64) >> -// CHECK14-DAG: define linkonce void @_ZdaPvm(i8*, i64) >> -// CHECK14-DAG: declare void @_ZdaPv(i8*) >> +// CHECK14UND-DAG: declare void @_ZdaPvm(i8*, i64) >> +// CHECK14DEF-DAG: define linkonce void @_ZdaPvm(i8*, i64) >> +// CHECK14DEF-DAG: declare void @_ZdaPv(i8*) >> > > Please can you update cxx_status.html and the Clang 3.7 release notes to > note that we now require one of (a) libc++ 3.7 or later, (b) libstdc++ 5 or > later, (c) -fdefine-sized-deallocation, or (d) -fno-sized-deallocation to > build code in C++14 mode? Thanks. >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
