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