summaryrefslogtreecommitdiffstats
path: root/contrib/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm')
-rw-r--r--contrib/llvm/include/llvm/DIBuilder.h2
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp43
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h3
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp32
-rw-r--r--contrib/llvm/patches/patch-r264826-llvm-r202188-variadic-fn-debug-info.diff176
-rw-r--r--contrib/llvm/patches/patch-r264827-clang-r202185-variadic-fn-debug-info.diff74
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp24
7 files changed, 321 insertions, 33 deletions
diff --git a/contrib/llvm/include/llvm/DIBuilder.h b/contrib/llvm/include/llvm/DIBuilder.h
index bac1679..c371d3d 100644
--- a/contrib/llvm/include/llvm/DIBuilder.h
+++ b/contrib/llvm/include/llvm/DIBuilder.h
@@ -439,7 +439,7 @@ namespace llvm {
/// through debug info anchors.
void retainType(DIType T);
- /// createUnspecifiedParameter - Create unspeicified type descriptor
+ /// createUnspecifiedParameter - Create unspecified type descriptor
/// for a subroutine type.
DIDescriptor createUnspecifiedParameter();
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index 97ef687..50f5cc9 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -1116,6 +1116,22 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
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 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
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 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
// 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())
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
index 69a96df..b9e941e 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
@@ -342,6 +342,9 @@ public:
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/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index d1e1ad1..d922433 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -404,15 +404,21 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU, DISubprogram SP) {
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 =
- 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);
+ 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);
+ 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 *DwarfDebug::createScopeChildrenDIE(CompileUnit *TheCU, LexicalScope *Scope,
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 @@ DIE *DwarfDebug::createScopeChildrenDIE(CompileUnit *TheCU, LexicalScope *Scope,
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)
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));
+ }
+
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
index fcb26f0..dc93d95 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -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 @@ void CGDebugInfo::CreateCompileUnit() {
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 @@ llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty,
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::DICompositeType CGDebugInfo::getOrCreateFunctionType(const Decl *D,
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));
}
OpenPOWER on IntegriCloud