diff options
author | emaste <emaste@FreeBSD.org> | 2014-04-23 18:36:32 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2014-04-23 18:36:32 +0000 |
commit | 222e977a76773a2fbb4fac594fe41d699b4389ea (patch) | |
tree | 46b1160fd7cd5e295675427418013a1aa11b2592 /contrib/llvm | |
parent | 0ac37969800a8ac2201ea61a5b45553955efcf6d (diff) | |
download | FreeBSD-src-222e977a76773a2fbb4fac594fe41d699b4389ea.zip FreeBSD-src-222e977a76773a2fbb4fac594fe41d699b4389ea.tar.gz |
Add patches corresponding to r264826 and r264827
Diffstat (limited to 'contrib/llvm')
-rw-r--r-- | contrib/llvm/patches/patch-r264826-llvm-r202188-variadic-fn-debug-info.diff | 176 | ||||
-rw-r--r-- | contrib/llvm/patches/patch-r264827-clang-r202185-variadic-fn-debug-info.diff | 74 |
2 files changed, 250 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r264826-llvm-r202188-variadic-fn-debug-info.diff b/contrib/llvm/patches/patch-r264826-llvm-r202188-variadic-fn-debug-info.diff new file mode 100644 index 0000000..6bb1db9 --- /dev/null +++ b/contrib/llvm/patches/patch-r264826-llvm-r202188-variadic-fn-debug-info.diff @@ -0,0 +1,176 @@ +Merge LLVM r202188: + + Debug info: Support variadic functions. + Variadic functions have an unspecified parameter tag after the last + argument. In IR this is represented as an unspecified parameter in the + subroutine type. + + Paired commit with CFE r202185. + + rdar://problem/13690847 + + This re-applies r202184 + a bugfix in DwarfDebug's argument handling. + +This merge includes a change to use the LLVM 3.4 API in +lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp: + +DwarfUnit -> CompileUnit + +Sponsored by: DARPA, AFRL + +http://svnweb.freebsd.org/changeset/base/264826 + +Index: include/llvm/DIBuilder.h +=================================================================== +--- include/llvm/DIBuilder.h (revision 264825) ++++ include/llvm/DIBuilder.h (revision 264826) +@@ -439,7 +439,7 @@ + /// through debug info anchors. + void retainType(DIType T); + +- /// createUnspecifiedParameter - Create unspeicified type descriptor ++ /// createUnspecifiedParameter - Create unspecified type descriptor + /// for a subroutine type. + DIDescriptor createUnspecifiedParameter(); + +Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp +=================================================================== +--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp (revision 264825) ++++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp (revision 264826) +@@ -404,15 +404,21 @@ + DIArray Args = SPTy.getTypeArray(); + uint16_t SPTag = SPTy.getTag(); + if (SPTag == dwarf::DW_TAG_subroutine_type) ++ // FIXME: Use DwarfUnit::constructSubprogramArguments() here. + for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { +- DIE *Arg = ++ DIType ATy(Args.getElement(i)); ++ if (ATy.isUnspecifiedParameter()) { ++ assert(i == N-1 && "ellipsis must be the last argument"); ++ SPCU->createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, *SPDie); ++ } else { ++ DIE *Arg = + SPCU->createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie); +- DIType ATy(Args.getElement(i)); +- SPCU->addType(Arg, ATy); +- if (ATy.isArtificial()) +- SPCU->addFlag(Arg, dwarf::DW_AT_artificial); +- if (ATy.isObjectPointer()) +- SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer, Arg); ++ SPCU->addType(Arg, ATy); ++ if (ATy.isArtificial()) ++ SPCU->addFlag(Arg, dwarf::DW_AT_artificial); ++ if (ATy.isObjectPointer()) ++ SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer, Arg); ++ } + } + DIE *SPDeclDie = SPDie; + SPDie = +@@ -579,7 +585,7 @@ + DIE *ObjectPointer = NULL; + + // Collect arguments for current function. +- if (LScopes.isCurrentFunctionScope(Scope)) ++ if (LScopes.isCurrentFunctionScope(Scope)) { + for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i) + if (DbgVariable *ArgDV = CurrentFnArguments[i]) + if (DIE *Arg = +@@ -588,6 +594,16 @@ + if (ArgDV->isObjectPointer()) ObjectPointer = Arg; + } + ++ // Create the unspecified parameter that marks a function as variadic. ++ DISubprogram SP(Scope->getScopeNode()); ++ assert(SP.Verify()); ++ DIArray FnArgs = SP.getType().getTypeArray(); ++ if (FnArgs.getElement(FnArgs.getNumElements()-1).isUnspecifiedParameter()) { ++ DIE *Ellipsis = new DIE(dwarf::DW_TAG_unspecified_parameters); ++ Children.push_back(Ellipsis); ++ } ++ } ++ + // Collect lexical scope children first. + const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope); + for (unsigned i = 0, N = Variables.size(); i < N; ++i) +Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +=================================================================== +--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (revision 264825) ++++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (revision 264826) +@@ -1116,6 +1116,22 @@ + addSourceLine(&Buffer, DTy); + } + ++/// constructSubprogramArguments - Construct function argument DIEs. ++void CompileUnit::constructSubprogramArguments(DIE &Buffer, DIArray Args) { ++ for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { ++ DIDescriptor Ty = Args.getElement(i); ++ if (Ty.isUnspecifiedParameter()) { ++ assert(i == N-1 && "ellipsis must be the last argument"); ++ createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer); ++ } else { ++ DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer); ++ addType(Arg, DIType(Ty)); ++ if (DIType(Ty).isArtificial()) ++ addFlag(Arg, dwarf::DW_AT_artificial); ++ } ++ } ++} ++ + /// Return true if the type is appropriately scoped to be contained inside + /// its own type unit. + static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) { +@@ -1170,19 +1186,12 @@ + addType(&Buffer, RTy); + + bool isPrototyped = true; +- // Add arguments. +- for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { +- DIDescriptor Ty = Elements.getElement(i); +- if (Ty.isUnspecifiedParameter()) { +- createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer); +- isPrototyped = false; +- } else { +- DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer); +- addType(Arg, DIType(Ty)); +- if (DIType(Ty).isArtificial()) +- addFlag(Arg, dwarf::DW_AT_artificial); +- } +- } ++ if (Elements.getNumElements() == 2 && ++ Elements.getElement(1).isUnspecifiedParameter()) ++ isPrototyped = false; ++ ++ constructSubprogramArguments(Buffer, Elements); ++ + // Add prototype flag if we're dealing with a C language and the + // function has been prototyped. + uint16_t Language = getLanguage(); +@@ -1475,13 +1484,7 @@ + + // Add arguments. Do not add arguments for subprogram definition. They will + // be handled while processing variables. +- for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { +- DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie); +- DIType ATy(Args.getElement(i)); +- addType(Arg, ATy); +- if (ATy.isArtificial()) +- addFlag(Arg, dwarf::DW_AT_artificial); +- } ++ constructSubprogramArguments(*SPDie, Args); + } + + if (SP.isArtificial()) +Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +=================================================================== +--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (revision 264825) ++++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (revision 264826) +@@ -342,6 +342,9 @@ + void emitHeader(const MCSection *ASection, const MCSymbol *ASectionSym); + + private: ++ /// constructSubprogramArguments - Construct function argument DIEs. ++ void constructSubprogramArguments(DIE &Buffer, DIArray Args); ++ + /// constructTypeDIE - Construct basic type die from DIBasicType. + void constructTypeDIE(DIE &Buffer, DIBasicType BTy); + diff --git a/contrib/llvm/patches/patch-r264827-clang-r202185-variadic-fn-debug-info.diff b/contrib/llvm/patches/patch-r264827-clang-r202185-variadic-fn-debug-info.diff new file mode 100644 index 0000000..7084f7b --- /dev/null +++ b/contrib/llvm/patches/patch-r264827-clang-r202185-variadic-fn-debug-info.diff @@ -0,0 +1,74 @@ +Merge Clang r202185: + + Debug info: Generate debug info for variadic functions. + Paired commit with LLVM. + + rdar://problem/13690847 + +This merege includes changes to use the Clang 3.4 API (revisions +199686 and 200082) in lib/CodeGen/CGDebugInfo.cpp: + +getParamType -> getArgType +getNumParams -> getNumArgs +getReturnType -> getResultType + +Sponsored by: DARPA, AFRL + +http://svnweb.freebsd.org/changeset/base/264827 + +Index: tools/clang/lib/CodeGen/CGDebugInfo.cpp +=================================================================== +--- tools/clang/lib/CodeGen/CGDebugInfo.cpp (revision 264826) ++++ tools/clang/lib/CodeGen/CGDebugInfo.cpp (revision 264827) +@@ -37,7 +37,7 @@ + #include "llvm/IR/Module.h" + #include "llvm/Support/Dwarf.h" + #include "llvm/Support/FileSystem.h" +-#include "llvm/Support/Path.h"
++#include "llvm/Support/Path.h" + using namespace clang; + using namespace clang::CodeGen; + +@@ -342,9 +342,9 @@ + if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { + MainFileDir = MainFile->getDir()->getName(); + if (MainFileDir != ".") { +- llvm::SmallString<1024> MainFileDirSS(MainFileDir);
+- llvm::sys::path::append(MainFileDirSS, MainFileName);
+- MainFileName = MainFileDirSS.str();
++ llvm::SmallString<1024> MainFileDirSS(MainFileDir); ++ llvm::sys::path::append(MainFileDirSS, MainFileName); ++ MainFileName = MainFileDirSS.str(); + } + } + +@@ -760,6 +760,8 @@ + else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { + for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) + EltTys.push_back(getOrCreateType(FPT->getArgType(i), Unit)); ++ if (FPT->isVariadic()) ++ EltTys.push_back(DBuilder.createUnspecifiedParameter()); + } + + llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); +@@ -2420,6 +2422,20 @@ + llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); + return DBuilder.createSubroutineType(F, EltTypeArray); + } ++ ++ // Variadic function. ++ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) ++ if (FD->isVariadic()) { ++ SmallVector<llvm::Value *, 16> EltTys; ++ EltTys.push_back(getOrCreateType(FD->getResultType(), F)); ++ if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FnType)) ++ for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) ++ EltTys.push_back(getOrCreateType(FPT->getArgType(i), F)); ++ EltTys.push_back(DBuilder.createUnspecifiedParameter()); ++ llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); ++ return DBuilder.createSubroutineType(F, EltTypeArray); ++ } ++ + return llvm::DICompositeType(getOrCreateType(FnType, F)); + } + |