diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 113 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 1 |
2 files changed, 4 insertions, 110 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 1fb7a36e21e..1e506d46553 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -47,7 +47,6 @@ protected: bool UseARMMethodPtrABI; bool UseARMGuardVarABI; bool Use32BitVTableOffsetABI; - bool UseQualifiedFunctionTypeInfoABI; ItaniumMangleContext &getMangleContext() { return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext()); @@ -59,8 +58,7 @@ public: bool UseARMGuardVarABI = false) : CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI), UseARMGuardVarABI(UseARMGuardVarABI), - Use32BitVTableOffsetABI(false), - UseQualifiedFunctionTypeInfoABI(CGM.getCodeGenOpts().QualifiedFunctionTypeInfo) { } + Use32BitVTableOffsetABI(false) { } bool classifyReturnType(CGFunctionInfo &FI) const override; @@ -2432,9 +2430,6 @@ class ItaniumRTTIBuilder { /// descriptor of the given type. llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty); - /// Determine whether FnTy should be emitted as a qualified function type. - bool EmitAsQualifiedFunctionType(const FunctionType *FnTy); - /// BuildVTablePointer - Build the vtable pointer for the given type. void BuildVTablePointer(const Type *Ty); @@ -2447,10 +2442,6 @@ class ItaniumRTTIBuilder { /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c. void BuildVMIClassTypeInfo(const CXXRecordDecl *RD); - /// Build an abi::__qualified_function_type_info struct, used for function - /// types with various kinds of qualifiers. - void BuildQualifiedFunctionTypeInfo(const FunctionType *FnTy); - /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used /// for pointer types. void BuildPointerTypeInfo(QualType PointeeTy); @@ -2467,27 +2458,6 @@ public: ItaniumRTTIBuilder(const ItaniumCXXABI &ABI) : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {} - // Function type info flags. - enum { - /// Qualifiers for 'this' pointer of member function type. - //@{ - QFTI_Const = 0x1, - QFTI_Volatile = 0x2, - QFTI_Restrict = 0x4, - QFTI_LValRef = 0x8, - QFTI_RValRef = 0x10, - //@} - - /// Noexcept function qualifier (C++17 onwards). - QFTI_Noexcept = 0x20, - - // Transaction-safe function qualifier (Transactional Memory TS). - //QFTI_TxSafe = 0x40, - - /// Noreturn function type qualifier (GNU/Clang extension). - QFTI_Noreturn = 0x80 - }; - // Pointer type info flags. enum { /// PTI_Const - Type has const qualifier. @@ -2839,12 +2809,8 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) { case Type::FunctionNoProto: case Type::FunctionProto: - if (EmitAsQualifiedFunctionType(cast<FunctionType>(Ty))) - // abi::__qualified_function_type_info. - VTableName = "_ZTVN10__cxxabiv130__qualified_function_type_infoE"; - else - // abi::__function_type_info. - VTableName = "_ZTVN10__cxxabiv120__function_type_infoE"; + // abi::__function_type_info. + VTableName = "_ZTVN10__cxxabiv120__function_type_infoE"; break; case Type::Enum: @@ -3058,15 +3024,10 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force, break; case Type::FunctionNoProto: - case Type::FunctionProto: { - auto *FnTy = cast<FunctionType>(Ty); + case Type::FunctionProto: // Itanium C++ ABI 2.9.5p5: // abi::__function_type_info adds no data members to std::type_info. - if (EmitAsQualifiedFunctionType(FnTy)) - // abi::__qualified_type_info adds a base function type and qualifiers. - BuildQualifiedFunctionTypeInfo(FnTy); break; - } case Type::Enum: // Itanium C++ ABI 2.9.5p5: @@ -3361,72 +3322,6 @@ void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { } } -bool ItaniumRTTIBuilder::EmitAsQualifiedFunctionType(const FunctionType *FnTy) { - if (!CXXABI.UseQualifiedFunctionTypeInfoABI) - return false; - - auto *FPT = dyn_cast<FunctionProtoType>(FnTy); - if (!FPT) - return false; - return FPT->getTypeQuals() || FPT->getRefQualifier() != RQ_None || - FPT->isNothrow(CXXABI.getContext()) || FPT->getNoReturnAttr(); -} - -void ItaniumRTTIBuilder::BuildQualifiedFunctionTypeInfo( - const FunctionType *FnTy) { - unsigned int Qualifiers = 0; - - auto ExtInfo = FnTy->getExtInfo(); - if (ExtInfo.getNoReturn()) { - Qualifiers |= QFTI_Noreturn; - ExtInfo = ExtInfo.withNoReturn(false); - } - - QualType BaseType; - if (auto *FPT = dyn_cast<FunctionProtoType>(FnTy)) { - auto EPI = FPT->getExtProtoInfo(); - EPI.ExtInfo = ExtInfo; - - if (EPI.TypeQuals & Qualifiers::Const) - Qualifiers |= QFTI_Const; - if (EPI.TypeQuals & Qualifiers::Volatile) - Qualifiers |= QFTI_Volatile; - if (EPI.TypeQuals & Qualifiers::Restrict) - Qualifiers |= QFTI_Restrict; - EPI.TypeQuals = 0; - - if (EPI.RefQualifier == RQ_LValue) - Qualifiers |= QFTI_LValRef; - else if (EPI.RefQualifier == RQ_RValue) - Qualifiers |= QFTI_RValRef; - EPI.RefQualifier = RQ_None; - - if (EPI.ExceptionSpec.Type == EST_BasicNoexcept) - Qualifiers |= QFTI_Noexcept; - else - assert(EPI.ExceptionSpec.Type == EST_None && - "unexpected canonical non-dependent exception spec"); - EPI.ExceptionSpec.Type = EST_None; - - BaseType = CXXABI.getContext().getFunctionType(FPT->getReturnType(), - FPT->getParamTypes(), EPI); - } else { - BaseType = - QualType(CXXABI.getContext().adjustFunctionType(FnTy, ExtInfo), 0); - } - - assert(Qualifiers && "should not have created qualified type info"); - - // __base_type is a pointer to the std::type_info derivation for the - // unqualified version of the function type. - Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(BaseType)); - - // __qualifiers is a flag word describing the qualifiers of the function type. - llvm::Type *UnsignedIntLTy = - CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); - Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Qualifiers)); -} - /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, /// used for pointer types. void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 874827b7e5f..af1ab071511 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -556,7 +556,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions); Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit); Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases); - Opts.QualifiedFunctionTypeInfo = Args.hasArg(OPT_mqualified_function_type_info); Opts.CodeModel = getCodeModel(Args, Diags); Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass); Opts.DisableFPElim = |