I think {rtti,Rtti,etc} should be consistently spelled RTTI? (outside
of the option, obviously)- Daniel On Fri, Jul 31, 2009 at 4:15 PM, Mike Stump<[email protected]> wrote: > Author: mrs > Date: Fri Jul 31 18:15:31 2009 > New Revision: 77751 > > URL: http://llvm.org/viewvc/llvm-project?rev=77751&view=rev > Log: > Add beginnigs of rtti generation, wire up more of -fno-exceptions. > > Modified: > cfe/trunk/include/clang/Basic/LangOptions.h > cfe/trunk/include/clang/Driver/Options.def > cfe/trunk/lib/CodeGen/CGCXX.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.h > cfe/trunk/lib/CodeGen/Mangle.cpp > cfe/trunk/lib/CodeGen/Mangle.h > cfe/trunk/lib/Driver/Tools.cpp > cfe/trunk/tools/clang-cc/clang-cc.cpp > > Modified: cfe/trunk/include/clang/Basic/LangOptions.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/LangOptions.h (original) > +++ cfe/trunk/include/clang/Basic/LangOptions.h Fri Jul 31 18:15:31 2009 > @@ -46,6 +46,7 @@ > unsigned LaxVectorConversions : 1; > unsigned AltiVec : 1; // Support AltiVec-style vector > initializers. > unsigned Exceptions : 1; // Support exception handling. > + unsigned Rtti : 1; // Support rtti information. > > unsigned NeXTRuntime : 1; // Use NeXT runtime. > unsigned Freestanding : 1; // Freestanding implementation > @@ -120,6 +121,7 @@ > C99 = Microsoft = CPlusPlus = CPlusPlus0x = 0; > CXXOperatorNames = PascalStrings = WritableStrings = 0; > Exceptions = NeXTRuntime = Freestanding = NoBuiltin = 0; > + Rtti = 1; > LaxVectorConversions = 1; > HeinousExtensions = 0; > AltiVec = OpenCL = StackProtector = 0; > > Modified: cfe/trunk/include/clang/Driver/Options.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.def?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Driver/Options.def (original) > +++ cfe/trunk/include/clang/Driver/Options.def Fri Jul 31 18:15:31 2009 > @@ -415,11 +415,13 @@ > OPTION("-fno-diagnostics-show-option", fno_diagnostics_show_option, Flag, > f_Group, INVALID, "", 0, 0, 0) > OPTION("-fno-dollars-in-identifiers", fno_dollars_in_identifiers, Flag, > f_Group, INVALID, "", 0, 0, 0) > OPTION("-fno-eliminate-unused-debug-symbols", > fno_eliminate_unused_debug_symbols, Flag, f_Group, INVALID, "", 0, 0, 0) > +OPTION("-fno-exceptions", fno_exceptions, Flag, f_Group, INVALID, "", 0, 0, > 0) > OPTION("-fno-inline-functions", fno_inline_functions, Flag, > clang_ignored_f_Group, INVALID, "", 0, 0, 0) > OPTION("-fno-inline", fno_inline, Flag, clang_ignored_f_Group, INVALID, "", > 0, 0, 0) > OPTION("-fno-keep-inline-functions", fno_keep_inline_functions, Flag, > clang_ignored_f_Group, INVALID, "", 0, 0, 0) > OPTION("-fno-math-errno", fno_math_errno, Flag, f_Group, INVALID, "", 0, 0, > 0) > OPTION("-fno-pascal-strings", fno_pascal_strings, Flag, f_Group, INVALID, > "", 0, 0, 0) > +OPTION("-fno-rtti", fno_rtti, Flag, f_Group, INVALID, "", 0, 0, 0) > OPTION("-fno-show-column", fno_show_column, Flag, f_Group, INVALID, "", 0, > 0, 0) > OPTION("-fno-show-source-location", fno_show_source_location, Flag, f_Group, > INVALID, "", 0, 0, 0) > OPTION("-fno-stack-protector", fno_stack_protector, Flag, f_Group, INVALID, > "", 0, 0, 0) > @@ -449,6 +451,7 @@ > OPTION("-fprofile-arcs", fprofile_arcs, Flag, f_Group, INVALID, "", 0, 0, 0) > OPTION("-fprofile-generate", fprofile_generate, Flag, f_Group, INVALID, "", > 0, 0, 0) > OPTION("-framework", framework, Separate, INVALID, INVALID, "l", 0, 0, 0) > +OPTION("-frtti", frtti, Flag, f_Group, INVALID, "", 0, 0, 0) > OPTION("-fshow-source-location", fshow_source_location, Flag, f_Group, > INVALID, "", 0, 0, 0) > OPTION("-fsigned-bitfields", fsigned_bitfields, Flag, f_Group, INVALID, "", > 0, 0, 0) > OPTION("-fsigned-char", fsigned_char, Flag, f_Group, INVALID, "", 0, 0, 0) > > Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Fri Jul 31 18:15:31 2009 > @@ -490,10 +490,42 @@ > return UniqueMangledName(Name.begin(), Name.end()); > } > > +llvm::Constant *CodeGenFunction::GenerateRtti(const CXXRecordDecl *RD) { > + llvm::Type *Ptr8Ty; > + Ptr8Ty = llvm::PointerType::get(llvm::Type::Int8Ty, 0); > + llvm::Constant *rtti = llvm::Constant::getNullValue(Ptr8Ty); > + > + if (!getContext().getLangOptions().Rtti) > + return rtti; > + > + llvm::SmallString<256> OutName; > + llvm::raw_svector_ostream Out(OutName); > + QualType ClassTy; > + // FIXME: What is the design on getTagDeclType when it requires casting > + // away const? mutable? > + ClassTy = getContext().getTagDeclType(const_cast<CXXRecordDecl*>(RD)); > + mangleCXXRtti(ClassTy, getContext(), Out); > + const char *Name = OutName.c_str(); > + llvm::GlobalVariable::LinkageTypes linktype; > + linktype = llvm::GlobalValue::WeakAnyLinkage; > + std::vector<llvm::Constant *> info; > + assert (0 && "FIXME: implement rtti descriptor"); > + // FIXME: descriptor > + info.push_back(llvm::Constant::getNullValue(Ptr8Ty)); > + assert (0 && "FIXME: implement rtti ts"); > + // FIXME: TS > + info.push_back(llvm::Constant::getNullValue(Ptr8Ty)); > + > + llvm::Constant *C; > + llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, info.size()); > + C = llvm::ConstantArray::get(type, info); > + rtti = new llvm::GlobalVariable(CGM.getModule(), type, true, linktype, C, > + Name); > + rtti = llvm::ConstantExpr::getBitCast(rtti, Ptr8Ty); > + return rtti; > +} > + > llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { > - const llvm::FunctionType *FTy; > - FTy = llvm::FunctionType::get(llvm::Type::VoidTy, > - std::vector<const llvm::Type*>(), false); > llvm::SmallString<256> OutName; > llvm::raw_svector_ostream Out(OutName); > QualType ClassTy; > @@ -512,7 +544,7 @@ > m = llvm::Constant::getNullValue(Ptr8Ty); > int64_t offset = 0; > methods.push_back(m); offset += LLVMPointerWidth; > - methods.push_back(m); offset += LLVMPointerWidth; > + methods.push_back(GenerateRtti(RD)); offset += LLVMPointerWidth; > for (meth_iter mi = RD->method_begin(), me = RD->method_end(); mi != me; > ++mi) { > if (mi->isVirtual()) { > @@ -526,7 +558,6 @@ > C = llvm::ConstantArray::get(type, methods); > llvm::Value *vtable = new llvm::GlobalVariable(CGM.getModule(), type, true, > linktype, C, Name); > - // CGM.CreateRuntimeFunction(FTy, Name); > vtable = Builder.CreateBitCast(vtable, Ptr8Ty); > // FIXME: finish layout for virtual bases > vtable = Builder.CreateGEP(vtable, > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Jul 31 18:15:31 2009 > @@ -358,6 +358,7 @@ > /// legal to call this function even if there is no current insertion point. > void FinishFunction(SourceLocation EndLoc=SourceLocation()); > > + llvm::Constant *GenerateRtti(const CXXRecordDecl *RD); > llvm::Value *GenerateVtable(const CXXRecordDecl *RD); > > void EmitCtorPrologue(const CXXConstructorDecl *CD); > > Modified: cfe/trunk/lib/CodeGen/Mangle.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mangle.cpp?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/Mangle.cpp (original) > +++ cfe/trunk/lib/CodeGen/Mangle.cpp Fri Jul 31 18:15:31 2009 > @@ -42,6 +42,7 @@ > void mangleGuardVariable(const VarDecl *D); > > void mangleCXXVtable(QualType Type); > + void mangleCXXRtti(QualType Type); > void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type); > void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type); > > @@ -165,6 +166,12 @@ > mangleType(T); > } > > +void CXXNameMangler::mangleCXXRtti(QualType T) { > + // <special-name> ::= TI <type> # typeinfo structure > + Out << "_ZTI"; > + mangleType(T); > +} > + > void CXXNameMangler::mangleGuardVariable(const VarDecl *D) > { > // <special-name> ::= GV <object name> # Guard variable for one-time > @@ -822,4 +829,12 @@ > > os.flush(); > } > + > + void mangleCXXRtti(QualType Type, ASTContext &Context, > + llvm::raw_ostream &os) { > + CXXNameMangler Mangler(Context, os); > + Mangler.mangleCXXRtti(Type); > + > + os.flush(); > + } > } > > Modified: cfe/trunk/lib/CodeGen/Mangle.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mangle.h?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/Mangle.h (original) > +++ cfe/trunk/lib/CodeGen/Mangle.h Fri Jul 31 18:15:31 2009 > @@ -37,6 +37,7 @@ > void mangleGuardVariable(const VarDecl *D, ASTContext &Context, > llvm::raw_ostream &os); > void mangleCXXVtable(QualType T, ASTContext &Context, llvm::raw_ostream > &os); > + void mangleCXXRtti(QualType T, ASTContext &Context, llvm::raw_ostream &os); > void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, > ASTContext &Context, llvm::raw_ostream &os); > void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, > > Modified: cfe/trunk/lib/Driver/Tools.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/Tools.cpp (original) > +++ cfe/trunk/lib/Driver/Tools.cpp Fri Jul 31 18:15:31 2009 > @@ -480,7 +480,6 @@ > > // Forward -f options which we can pass directly. > Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); > - Args.AddLastArg(CmdArgs, options::OPT_fexceptions); > Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); > Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); > Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime); > @@ -530,6 +529,20 @@ > CmdArgs.push_back("-fblocks=0"); > } > > + // -fexceptions default varies depending on platform and language; only > + // pass if specified. > + if (Arg *A = Args.getLastArg(options::OPT_fexceptions, > + options::OPT_fno_exceptions)) { > + if (A->getOption().matches(options::OPT_fexceptions)) > + CmdArgs.push_back("-fexceptions"); > + else > + CmdArgs.push_back("-fexceptions=0"); > + } > + > + // -frtti is default, only pass non-default. > + if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) > + CmdArgs.push_back("-frtti=0"); > + > // -fsigned-char/-funsigned-char default varies depending on platform; only > // pass if specified. > if (Arg *A = Args.getLastArg(options::OPT_fsigned_char, > @@ -1669,6 +1682,7 @@ > // Derived from darwin_iphoneos_libgcc spec. > CmdArgs.push_back("-lgcc_s.10.5"); > } else if (Args.hasArg(options::OPT_shared_libgcc) || > + // FIXME: -fexceptions -fno-exceptions means no exceptions > Args.hasArg(options::OPT_fexceptions) || > Args.hasArg(options::OPT_fgnu_runtime)) { > // FIXME: This is probably broken on 10.3? > > Modified: cfe/trunk/tools/clang-cc/clang-cc.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-cc/clang-cc.cpp?rev=77751&r1=77750&r2=77751&view=diff > > ============================================================================== > --- cfe/trunk/tools/clang-cc/clang-cc.cpp (original) > +++ cfe/trunk/tools/clang-cc/clang-cc.cpp Fri Jul 31 18:15:31 2009 > @@ -592,6 +592,10 @@ > llvm::cl::desc("Enable support for exception handling")); > > static llvm::cl::opt<bool> > +Rtti("frtti", llvm::cl::init(true), > + llvm::cl::desc("Enable generation of rtti information")); > + > +static llvm::cl::opt<bool> > GNURuntime("fgnu-runtime", > llvm::cl::desc("Generate output compatible with the standard GNU " > "Objective-C runtime")); > @@ -769,6 +773,7 @@ > if (NoLaxVectorConversions.getPosition()) > Options.LaxVectorConversions = 0; > Options.Exceptions = Exceptions; > + Options.Rtti = Rtti; > if (EnableBlocks.getPosition()) > Options.Blocks = EnableBlocks; > if (CharIsSigned.getPosition()) > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
