diff options
-rw-r--r-- | include/clang/Driver/CC1Options.td | 2 | ||||
-rw-r--r-- | include/clang/Driver/Options.td | 2 | ||||
-rw-r--r-- | include/clang/Frontend/CodeGenOptions.h | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 52 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 11 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 1 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 1 |
8 files changed, 68 insertions, 7 deletions
diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 6de5bf14fd..363ea7bb54 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -131,6 +131,8 @@ def dwarf_debug_flags : Separate<"-dwarf-debug-flags">, def g : Flag<"-g">, HelpText<"Generate source level debug information">; def fcatch_undefined_behavior : Flag<"-fcatch-undefined-behavior">, HelpText<"Generate runtime checks for undefined behavior.">; +def flimit_debug_info : Flag<"-flimit-debug-info">, + HelpText<"Limit debug information produced to reduce size of debug binary">; def fno_common : Flag<"-fno-common">, HelpText<"Compile common globals like normal definitions">; def no_implicit_float : Flag<"-no-implicit-float">, diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 95b84d3f70..fed03f755a 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -288,6 +288,8 @@ def finstrument_functions : Flag<"-finstrument-functions">, Group<f_Group>; def fkeep_inline_functions : Flag<"-fkeep-inline-functions">, Group<clang_ignored_f_Group>; def flat__namespace : Flag<"-flat_namespace">; def flax_vector_conversions : Flag<"-flax-vector-conversions">, Group<f_Group>; +def flimit_debug_info : Flag<"-flimit-debug-info">, Group<f_Group>, + HelpText<"Limit debug information produced to reduce size of debug binary">; def flimited_precision_EQ : Joined<"-flimited-precision=">, Group<f_Group>; def flto : Flag<"-flto">, Group<f_Group>; def fmacro_backtrace_limit_EQ : Joined<"-fmacro-backtrace-limit=">, diff --git a/include/clang/Frontend/CodeGenOptions.h b/include/clang/Frontend/CodeGenOptions.h index b3f57094b4..ffaaedc30e 100644 --- a/include/clang/Frontend/CodeGenOptions.h +++ b/include/clang/Frontend/CodeGenOptions.h @@ -40,6 +40,7 @@ public: /// aliases to base ctors when possible. unsigned DataSections : 1; /// Set when -fdata-sections is enabled unsigned DebugInfo : 1; /// Should generate debug info (-g). + unsigned LimitDebugInfo : 1; /// Limit generated debug info to reduce size. unsigned DisableFPElim : 1; /// Set when -fomit-frame-pointer is enabled. unsigned DisableLLVMOpts : 1; /// Don't run any optimizations, for use in /// getting .bc files that correspond to the @@ -109,6 +110,7 @@ public: CXXCtorDtorAliases = 0; DataSections = 0; DebugInfo = 0; + LimitDebugInfo = 0; DisableFPElim = 0; DisableLLVMOpts = 0; DisableRedZone = 0; diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 45a887b1bb..29a4377dd1 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -413,12 +413,44 @@ llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, Ty->getPointeeType(), Unit); } +/// CreatePointeeType - Create PointTee type. If Pointee is a record +/// then emit record's fwd if debug info size reduction is enabled. +llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, + llvm::DIFile Unit) { + if (!CGM.getCodeGenOpts().LimitDebugInfo) + return getOrCreateType(PointeeTy, Unit); + + if (const RecordType *RTy = dyn_cast<RecordType>(PointeeTy)) { + RecordDecl *RD = RTy->getDecl(); + unsigned RTag; + if (RD->isStruct()) + RTag = llvm::dwarf::DW_TAG_structure_type; + else if (RD->isUnion()) + RTag = llvm::dwarf::DW_TAG_union_type; + else { + assert(RD->isClass() && "Unknown RecordType!"); + RTag = llvm::dwarf::DW_TAG_class_type; + } + + llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); + unsigned Line = getLineNumber(RD->getLocation()); + llvm::DIDescriptor FDContext = + getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit); + + return + DebugFactory.CreateCompositeType(RTag, FDContext, RD->getName(), + DefUnit, Line, 0, 0, 0, + llvm::DIType::FlagFwdDecl, + llvm::DIType(), llvm::DIArray()); + } + return getOrCreateType(PointeeTy, Unit); + +} + llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, const Type *Ty, QualType PointeeTy, llvm::DIFile Unit) { - llvm::DIType EltTy = getOrCreateType(PointeeTy, Unit); - // Bit size, align and offset of the type. // Size is always the size of a pointer. We can't use getTypeSize here @@ -427,10 +459,10 @@ llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, CGM.getContext().Target.getPointerWidth(PointeeTy.getAddressSpace()); uint64_t Align = CGM.getContext().getTypeAlign(Ty); - return - DebugFactory.CreateDerivedType(Tag, Unit, "", Unit, - 0, Size, Align, 0, 0, EltTy); - + return DebugFactory.CreateDerivedType(Tag, Unit, "", Unit, + 0, Size, Align, 0, 0, + CreatePointeeType(PointeeTy, Unit)); + } llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, @@ -877,6 +909,14 @@ CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, EltTys.push_back(VPTR); } +/// getOrCreateRecordType - Emit record type's standalone debug info. +llvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, + SourceLocation Loc) { + llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc)); + DebugFactory.RecordType(T); + return T; +} + /// CreateType - get structure or union type. llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, llvm::DIFile Unit) { diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index a1ad012353..6df9a2fcb7 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -98,7 +98,7 @@ class CGDebugInfo { llvm::DIType getOrCreateVTablePtrType(llvm::DIFile F); llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N, llvm::DIDescriptor Unit); - + llvm::DIType CreatePointeeType(QualType PointeeTy, llvm::DIFile F); llvm::DIType CreatePointerLikeType(unsigned Tag, const Type *Ty, QualType PointeeTy, llvm::DIFile F); @@ -189,6 +189,8 @@ public: void EmitGlobalVariable(const ValueDecl *VD, llvm::ConstantInt *Init, CGBuilderTy &Builder); + /// getOrCreateRecordType - Emit record type's standalone debug info. + llvm::DIType getOrCreateRecordType(QualType Ty, SourceLocation L); private: /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration. void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI, diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index 68f4058389..bc4059593f 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -11,9 +11,11 @@ // //===----------------------------------------------------------------------===// +#include "clang/Frontend/CodeGenOptions.h" #include "CodeGenFunction.h" #include "CGCXXABI.h" #include "CGObjCRuntime.h" +#include "CGDebugInfo.h" #include "llvm/Intrinsics.h" using namespace clang; using namespace CodeGen; @@ -87,6 +89,15 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, const MemberExpr *ME = cast<MemberExpr>(CE->getCallee()->IgnoreParens()); const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl()); + CGDebugInfo *DI = getDebugInfo(); + if (DI && CGM.getCodeGenOpts().LimitDebugInfo) { + QualType PQTy = ME->getBase()->IgnoreParenImpCasts()->getType(); + if (const PointerType * PTy = dyn_cast<PointerType>(PQTy)) { + DI->getOrCreateRecordType(PTy->getPointeeType(), + MD->getParent()->getLocation()); + } + } + if (MD->isStatic()) { // The method is static, emit it as we would a regular call. llvm::Value *Callee = CGM.GetAddrOfFunction(MD); diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 83ec814bc0..1662c375e6 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1165,6 +1165,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior); Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); + Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); // -flax-vector-conversions is default. if (!Args.hasFlag(options::OPT_flax_vector_conversions, diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 11869a17d6..132d7d0f8e 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -859,6 +859,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, : CodeGenOptions::OnlyAlwaysInlining; Opts.DebugInfo = Args.hasArg(OPT_g); + Opts.LimitDebugInfo = Args.hasArg(OPT_flimit_debug_info); Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns); Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags); |