3 Debug info: Generate debug info for variadic functions.
4 Paired commit with LLVM.
6 rdar://problem/13690847
8 This merege includes changes to use the Clang 3.4 API (revisions
9 199686 and 200082) in lib/CodeGen/CGDebugInfo.cpp:
11 getParamType -> getArgType
12 getNumParams -> getNumArgs
13 getReturnType -> getResultType
15 Sponsored by: DARPA, AFRL
17 Introduced here: http://svnweb.freebsd.org/changeset/base/264827
19 Index: 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)
24 #include "llvm/IR/Module.h"
25 #include "llvm/Support/Dwarf.h"
26 #include "llvm/Support/FileSystem.h"
27 -#include "llvm/Support/Path.h"
\r
28 +#include "llvm/Support/Path.h"
29 using namespace clang;
30 using namespace clang::CodeGen;
33 if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
34 MainFileDir = MainFile->getDir()->getName();
35 if (MainFileDir != ".") {
36 - llvm::SmallString<1024> MainFileDirSS(MainFileDir);
\r
37 - llvm::sys::path::append(MainFileDirSS, MainFileName);
\r
38 - MainFileName = MainFileDirSS.str();
\r
39 + llvm::SmallString<1024> MainFileDirSS(MainFileDir);
40 + llvm::sys::path::append(MainFileDirSS, MainFileName);
41 + MainFileName = MainFileDirSS.str();
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());
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);
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);
72 return llvm::DICompositeType(getOrCreateType(FnType, F));