summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Enderby <enderby@apple.com>2014-08-04 23:14:37 +0000
committerKevin Enderby <enderby@apple.com>2014-08-04 23:14:37 +0000
commite3c13468bf0371ef5f270bd74e3388e4cd1b6574 (patch)
treed7536279fbe450b73619ece15ffddfb8fe8c1591
parentec7cbd7d14db9aee087394488b8e9aa16742e597 (diff)
downloadbcm5719-llvm-e3c13468bf0371ef5f270bd74e3388e4cd1b6574.tar.gz
bcm5719-llvm-e3c13468bf0371ef5f270bd74e3388e4cd1b6574.zip
Enable Darwin vararg parameters support in assembler macros.
Duplicate the vararg tests for linux and add a tests which mixed vararg arguments with darwin positional parameters. Patch by: Janne Grunau <j@jannau.net> llvm-svn: 214799
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp2
-rw-r--r--llvm/test/MC/AsmParser/macros-darwin-vararg.s92
2 files changed, 88 insertions, 6 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index 897999c461f..79e4306ffca 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -3302,7 +3302,7 @@ bool AsmParser::parseDirectiveMacro(SMLoc DirectiveLoc) {
if (Qualifier == "req")
Parameter.Required = true;
- else if (Qualifier == "vararg" && !IsDarwin)
+ else if (Qualifier == "vararg")
Parameter.Vararg = true;
else
return Error(QualLoc, Qualifier + " is not a valid parameter qualifier "
diff --git a/llvm/test/MC/AsmParser/macros-darwin-vararg.s b/llvm/test/MC/AsmParser/macros-darwin-vararg.s
index a650c0871d2..4aa2f4c1d9b 100644
--- a/llvm/test/MC/AsmParser/macros-darwin-vararg.s
+++ b/llvm/test/MC/AsmParser/macros-darwin-vararg.s
@@ -1,8 +1,90 @@
-// RUN: not llvm-mc -triple i386-apple-darwin10 %s 2>&1 | FileCheck %s
+// RUN: llvm-mc -triple i386-apple-darwin10 %s 2>&1 | FileCheck %s
-// CHECK: error: vararg is not a valid parameter qualifier for 'arg' in macro 'abc'
-// CHECK: .macro abc arg:vararg
+.macro abc a b:vararg
+.globl "\a, \b"
+.endm
+
+// CHECK: .globl "zed0, zed1, zed2"
+abc zed0, zed1, zed2
+
+.purgem abc
+
+.macro ifcc arg:vararg
+.if cc
+ \arg
+.endif
+.endm
+
+.macro ifcc2 arg0 arg1:vararg
+.if cc
+ movl \arg0, \arg1
+.endif
+.endm
+
+.macro ifcc3 arg0, arg1:vararg
+.if cc
+ movl \arg0, \arg1
+.endif
+.endm
+
+.macro ifcc4 arg0, arg1:vararg
+.if cc
+ movl \arg1, \arg0
+.endif
+.endm
-.macro abc arg:vararg
- \arg
+.text
+
+// CHECK: movl %esp, %ebp
+// CHECK: subl $0, %esp
+// CHECK: movl %eax, %ebx
+// CHECK: movl %ecx, %ebx
+// CHECK: movl %ecx, %eax
+// CHECK: movl %eax, %ecx
+// CHECK: movl %ecx, %eax
+// CHECK: movl %eax, %ecx
+.set cc,1
+ ifcc movl %esp, %ebp
+ subl $0, %esp
+
+ ifcc2 %eax, %ebx
+ ifcc2 %ecx, %ebx
+ ifcc3 %ecx, %eax
+ ifcc3 %eax, %ecx
+ ifcc4 %eax, %ecx ## test
+ ifcc4 %ecx, %eax ## test
+
+// CHECK-NOT movl
+// CHECK: subl $1, %esp
+.set cc,0
+ ifcc movl, %esp, %ebp
+ subl $1, %esp
+
+.macro abc arg:vararg=nop
+ \arg
+.endm
+
+.macro abcd arg0=%eax, arg1:vararg=%ebx
+ movl \arg0, \arg1
.endm
+
+.text
+
+// CHECK: nop
+ abc
+// CHECK: movl %eax, %ebx
+ abcd ,
+
+.macro .make_macro start, end, name, body:vararg
+\start \name
+\body
+\end
+.endmacro
+
+.make_macro .macro,.endmacro,.mybyte,.byte $0, $2, $1
+
+.data
+// CHECK: .byte 10
+// CHECK: .byte 12
+// CHECK: .byte 11
+.mybyte 10,11,12
OpenPOWER on IntegriCloud