patch-r264827-clang-r202185-variadic-fn-debug-info.diff revision 269012
1Merge Clang r202185: 2 3 Debug info: Generate debug info for variadic functions. 4 Paired commit with LLVM. 5 6 rdar://problem/13690847 7 8This merege includes changes to use the Clang 3.4 API (revisions 9199686 and 200082) in lib/CodeGen/CGDebugInfo.cpp: 10 11getParamType -> getArgType 12getNumParams -> getNumArgs 13getReturnType -> getResultType 14 15Sponsored by: DARPA, AFRL 16 17Introduced here: http://svnweb.freebsd.org/changeset/base/264827 18 19Index: tools/clang/lib/CodeGen/CGDebugInfo.cpp 20=================================================================== 21--- tools/clang/lib/CodeGen/CGDebugInfo.cpp (revision 264826) 22+++ tools/clang/lib/CodeGen/CGDebugInfo.cpp (revision 264827) 23@@ -37,7 +37,7 @@ 24 #include "llvm/IR/Module.h" 25 #include "llvm/Support/Dwarf.h" 26 #include "llvm/Support/FileSystem.h" 27-#include "llvm/Support/Path.h" 28+#include "llvm/Support/Path.h" 29 using namespace clang; 30 using namespace clang::CodeGen; 31 32@@ -342,9 +342,9 @@ 33 if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 34 MainFileDir = MainFile->getDir()->getName(); 35 if (MainFileDir != ".") { 36- llvm::SmallString<1024> MainFileDirSS(MainFileDir); 37- llvm::sys::path::append(MainFileDirSS, MainFileName); 38- MainFileName = MainFileDirSS.str(); 39+ llvm::SmallString<1024> MainFileDirSS(MainFileDir); 40+ llvm::sys::path::append(MainFileDirSS, MainFileName); 41+ MainFileName = MainFileDirSS.str(); 42 } 43 } 44 45@@ -760,6 +760,8 @@ 46 else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 47 for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 48 EltTys.push_back(getOrCreateType(FPT->getArgType(i), Unit)); 49+ if (FPT->isVariadic()) 50+ EltTys.push_back(DBuilder.createUnspecifiedParameter()); 51 } 52 53 llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 54@@ -2420,6 +2422,20 @@ 55 llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 56 return DBuilder.createSubroutineType(F, EltTypeArray); 57 } 58+ 59+ // Variadic function. 60+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 61+ if (FD->isVariadic()) { 62+ SmallVector<llvm::Value *, 16> EltTys; 63+ EltTys.push_back(getOrCreateType(FD->getResultType(), F)); 64+ if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FnType)) 65+ for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 66+ EltTys.push_back(getOrCreateType(FPT->getArgType(i), F)); 67+ EltTys.push_back(DBuilder.createUnspecifiedParameter()); 68+ llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 69+ return DBuilder.createSubroutineType(F, EltTypeArray); 70+ } 71+ 72 return llvm::DICompositeType(getOrCreateType(FnType, F)); 73 } 74 75