From 16fb1632a122d0d0253f719c6b831c72c4dff23a Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Tue, 2 Jun 2015 17:17:44 +0000 Subject: [PATCH] DebugInfo: Really support 2^16 arguments in a subprogram As a follow-up to r235955, actually support up to 65535 arguments in a subprogram. r235955 missed assembly support, having only tested the new limit via C++ unit tests. Code patch by Amjad Aboud. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238854 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AsmParser/LLParser.cpp | 2 +- test/Assembler/dilocalvariable-arg-large.ll | 10 ++++++++++ test/Assembler/invalid-dilocalvariable-arg-large.ll | 6 ++++++ test/Assembler/invalid-dilocalvariable-arg-negative.ll | 6 ++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/Assembler/dilocalvariable-arg-large.ll create mode 100644 test/Assembler/invalid-dilocalvariable-arg-large.ll create mode 100644 test/Assembler/invalid-dilocalvariable-arg-negative.ll diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 28419fb27c1..681af2a9007 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -3730,7 +3730,7 @@ bool LLParser::ParseDILocalVariable(MDNode *&Result, bool IsDistinct) { OPTIONAL(file, MDField, ); \ OPTIONAL(line, LineField, ); \ OPTIONAL(type, MDField, ); \ - OPTIONAL(arg, MDUnsignedField, (0, UINT8_MAX)); \ + OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \ OPTIONAL(flags, DIFlagField, ); PARSE_MD_FIELDS(); #undef VISIT_MD_FIELDS diff --git a/test/Assembler/dilocalvariable-arg-large.ll b/test/Assembler/dilocalvariable-arg-large.ll new file mode 100644 index 00000000000..7788186a54a --- /dev/null +++ b/test/Assembler/dilocalvariable-arg-large.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s +; RUN: verify-uselistorder %s + +; CHECK: !named = !{!0, !1} +!named = !{!0, !1} + +!0 = distinct !DISubprogram() + +; CHECK: !1 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "foo", arg: 65535, scope: !0) +!1 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "foo", arg: 65535, scope: !0) diff --git a/test/Assembler/invalid-dilocalvariable-arg-large.ll b/test/Assembler/invalid-dilocalvariable-arg-large.ll new file mode 100644 index 00000000000..d62da601e13 --- /dev/null +++ b/test/Assembler/invalid-dilocalvariable-arg-large.ll @@ -0,0 +1,6 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +!0 = !DILocalVariable(tag: DW_TAG_arg_variable, scope: !{}, arg: 65535) + +; CHECK: :[[@LINE+1]]:66: error: value for 'arg' too large, limit is 65535 +!1 = !DILocalVariable(tag: DW_TAG_arg_variable, scope: !{}, arg: 65536) diff --git a/test/Assembler/invalid-dilocalvariable-arg-negative.ll b/test/Assembler/invalid-dilocalvariable-arg-negative.ll new file mode 100644 index 00000000000..08e370a3666 --- /dev/null +++ b/test/Assembler/invalid-dilocalvariable-arg-negative.ll @@ -0,0 +1,6 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +!0 = !DILocalVariable(tag: DW_TAG_arg_variable, scope: !{}, arg: 0) + +; CHECK: :[[@LINE+1]]:66: error: expected unsigned integer +!1 = !DILocalVariable(tag: DW_TAG_arg_variable, scope: !{}, arg: -1) -- 2.34.1