[llvm-size][test] Improve llvm-size testing
authorJames Henderson <jh7370@my.bristol.ac.uk>
Wed, 14 Aug 2019 10:17:34 +0000 (10:17 +0000)
committerJames Henderson <jh7370@my.bristol.ac.uk>
Wed, 14 Aug 2019 10:17:34 +0000 (10:17 +0000)
This patch significantly improves the llvm-size testing. The changes
made are:

1) Change all tests to use yaml2obj instead of assembly or pre-canned
   inputs.
2) Move the tests out of the X86 directory, since they don't need to be
   there after 1).
3) Increased test coverage.
4) Added comments to explain purpose of tests.

I haven't attempted to add test coverage for all Mach-O related code, as
I am not familiar enough with that file format to be able to.

Reviewers: grimar, MaskRay

Differential Revision: https://reviews.llvm.org/D66134

llvm-svn: 368821

27 files changed:
llvm/test/tools/llvm-size/Inputs/darwin-m.o [deleted file]
llvm/test/tools/llvm-size/Inputs/darwin-m1.o [deleted file]
llvm/test/tools/llvm-size/X86/elf-sizes.test [deleted file]
llvm/test/tools/llvm-size/X86/format-berkeley-tabs.s [deleted file]
llvm/test/tools/llvm-size/X86/ignore-sections.s [deleted file]
llvm/test/tools/llvm-size/X86/lit.local.cfg [deleted file]
llvm/test/tools/llvm-size/X86/test-common.s [deleted file]
llvm/test/tools/llvm-size/archive.test [new file with mode: 0644]
llvm/test/tools/llvm-size/basic.test [deleted file]
llvm/test/tools/llvm-size/common.test [new file with mode: 0644]
llvm/test/tools/llvm-size/darwin-m.test
llvm/test/tools/llvm-size/elf-berkeley.test [new file with mode: 0644]
llvm/test/tools/llvm-size/elf-m.test [new file with mode: 0644]
llvm/test/tools/llvm-size/elf-sysv.test [new file with mode: 0644]
llvm/test/tools/llvm-size/help.test
llvm/test/tools/llvm-size/invalid-input.test [new file with mode: 0644]
llvm/test/tools/llvm-size/long-format.test [new file with mode: 0644]
llvm/test/tools/llvm-size/macho-berkeley.test [new file with mode: 0644]
llvm/test/tools/llvm-size/macho-sysv.test [new file with mode: 0644]
llvm/test/tools/llvm-size/multiple-inputs.test [new file with mode: 0644]
llvm/test/tools/llvm-size/no-input.test [new file with mode: 0644]
llvm/test/tools/llvm-size/radix.test [new file with mode: 0644]
llvm/test/tools/llvm-size/response-file.test [new file with mode: 0644]
llvm/test/tools/llvm-size/stdin.test [new file with mode: 0644]
llvm/test/tools/llvm-size/totals.test [new file with mode: 0644]
llvm/test/tools/llvm-size/unknown-format.test [new file with mode: 0644]
llvm/test/tools/llvm-size/version.test [new file with mode: 0644]

diff --git a/llvm/test/tools/llvm-size/Inputs/darwin-m.o b/llvm/test/tools/llvm-size/Inputs/darwin-m.o
deleted file mode 100644 (file)
index 9672df5..0000000
Binary files a/llvm/test/tools/llvm-size/Inputs/darwin-m.o and /dev/null differ
diff --git a/llvm/test/tools/llvm-size/Inputs/darwin-m1.o b/llvm/test/tools/llvm-size/Inputs/darwin-m1.o
deleted file mode 100644 (file)
index 9672df5..0000000
Binary files a/llvm/test/tools/llvm-size/Inputs/darwin-m1.o and /dev/null differ
diff --git a/llvm/test/tools/llvm-size/X86/elf-sizes.test b/llvm/test/tools/llvm-size/X86/elf-sizes.test
deleted file mode 100644 (file)
index cb7fcd3..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-# RUN: yaml2obj %s > %t.o
-# RUN: llvm-size -B %t.o | FileCheck %s
-
-!ELF
-FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_EXEC
-  Machine:         EM_X86_64
-Sections:
-  - Name:            .bss
-    Type:            SHT_NOBITS
-    Flags:           [ SHF_ALLOC, SHF_WRITE ]
-    Size:            1
-  - Name:            .text
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
-    Size:            2
-  - Name:            .unusual_name_for_code
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
-    Size:            64
-  - Name:            .eh_frame
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC ]
-    Size:            4
-  - Name:            .data
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_WRITE ]
-    Size:            8
-  - Name:            .moar_stuff
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_WRITE ]
-    Size:            128
-  - Name:            .text.but_not_really
-    Type:            SHT_PROGBITS
-    Flags:           [ ]
-    Size:            256
-  - Name:            .debug_info
-    Type:            SHT_PROGBITS
-    Flags:           [ ]
-    Size:            16
-  - Name:            .init_array
-    Type:            SHT_INIT_ARRAY
-    Flags:           [ SHF_ALLOC, SHF_WRITE ]
-    Size:            32
-
-# text is .text, .eh_frame, .unusual_name_for_code: 2 + 4 + 64 = 70
-# data is .data, .init_array, .moar_stuff: 8 + 32 + 128 = 168
-# bss is .bss: 1
-# total: 239
-# unaccounted for (not affecting total) is .debug_info, .text.but_not_really
-
-# CHECK: text data bss dec
-# CHECK: 70   168  1   239
diff --git a/llvm/test/tools/llvm-size/X86/format-berkeley-tabs.s b/llvm/test/tools/llvm-size/X86/format-berkeley-tabs.s
deleted file mode 100644 (file)
index c3e7e1e..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
-// RUN: llvm-size -B -t %t.o | FileCheck %s --strict-whitespace
-
-        .text
-        .zero 4
-        .data
-        .long foo
-        .bss
-        .zero 4
-
-// Note: this test enables --strict-whitespace to check for literal tabs
-// between each field.
-// CHECK:      text    {{ *}}data      {{ *}}bss       {{ *}}dec       {{ *}}hex       {{ *}}filename
-// CHECK-NEXT: 4       {{ *}}4 {{ *}}4 {{ *}}12        {{ *}}c {{ *}}{{[ -\(\)_A-Za-z0-9.\\/:]+}}
-// CHECK-NEXT: 4       {{ *}}4 {{ *}}4 {{ *}}12        {{ *}}c {{ *}}(TOTALS)
diff --git a/llvm/test/tools/llvm-size/X86/ignore-sections.s b/llvm/test/tools/llvm-size/X86/ignore-sections.s
deleted file mode 100644 (file)
index 61aa2e7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
-// RUN: llvm-size -A %t.o | FileCheck --check-prefix="SYSV" %s
-// RUN: llvm-size -B -t %t.o| FileCheck --check-prefix="BSD" %s
-
-        .text
-        .zero 4
-        .data
-        .long foo
-        .bss
-        .zero 4
-        .ident "foo"
-        .section foo
-        .long 42
-        .cfi_startproc
-        .cfi_endproc
-
-// SYSV:    {{[ -\(\)_A-Za-z0-9.\\/:]+}}  :
-// SYSV-NEXT:    section             size   addr
-// SYSV-NEXT:    .text                  4      0
-// SYSV-NEXT:    .data                  4      0
-// SYSV-NEXT:    .bss                   4      0
-// SYSV-NEXT:    .comment               5      0
-// SYSV-NEXT:    foo                    4      0
-// SYSV-NEXT:    .eh_frame             48      0
-// SYSV-NEXT:    Total                 69
-
-// BSD:        text    data     bss     dec     hex filename
-// BSD-NEXT:     52       4       4      60      3c {{[ -\(\)_A-Za-z0-9.\\/:]+}}
-// BSD-NEXT:     52       4       4      60      3c (TOTALS)
diff --git a/llvm/test/tools/llvm-size/X86/lit.local.cfg b/llvm/test/tools/llvm-size/X86/lit.local.cfg
deleted file mode 100644 (file)
index c8625f4..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-if not 'X86' in config.root.targets:
-    config.unsupported = True
diff --git a/llvm/test/tools/llvm-size/X86/test-common.s b/llvm/test/tools/llvm-size/X86/test-common.s
deleted file mode 100644 (file)
index 4b61d24..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// #Check that with common switch commons are added to bss or
-// #Shown as *COM* otherwise their size is discounted
-// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
-// RUN: llvm-size -A --common %t.o | FileCheck --check-prefix=SYSV %s
-// RUN: llvm-size -B --common %t.o | FileCheck --check-prefix=BSD %s
-// RUN: llvm-size -A %t.o | FileCheck --check-prefix=SYSVNOCOMM %s
-// RUN: llvm-size -B %t.o | FileCheck --check-prefix=BSDNOCOMM %s
-       .type   x,@object
-       .comm   x,4,4
-       .type   y,@object
-       .comm   y,4,4
-       .type   z,@object
-       .comm   z,4,4
-// SYSV:      {{[ -\(\)_A-Za-z0-9.\\/:]+}}  :
-// SYSV-NEXT: section   size   addr
-// SYSV-NEXT: .text          0      0
-// SYSV-NEXT: *COM*     12      0
-// SYSV-NEXT: Total     12
-
-// SYSVNOCOMM:      {{[ -\(\)_A-Za-z0-9.\\/:]+}}  :
-// SYSVNOCOMM-NEXT: section   size   addr
-// SYSVNOCOMM-NEXT: .text          0      0
-// SYSVNOCOMM-NEXT: Total      0
-
-// BSD:      text    data     bss     dec     hex filename
-// BSD-NEXT:    0       0      12       12       c  {{[ -\(\)_A-Za-z0-9.\\/:]+}}
-
-// BSDNOCOMM:      text    data     bss     dec     hex filename
-// BSDNOCOMM-NEXT:    0       0       0       0       0  {{[ -\(\)_A-Za-z0-9.\\/:]+}}
diff --git a/llvm/test/tools/llvm-size/archive.test b/llvm/test/tools/llvm-size/archive.test
new file mode 100644 (file)
index 0000000..b750f08
--- /dev/null
@@ -0,0 +1,125 @@
+## Show how llvm-size behaves when passed in an archive.
+
+# RUN: yaml2obj %s --docnum=1 -o %t1
+# RUN: yaml2obj %s --docnum=2 -o %t2
+
+## Case 1: Empty archive. No output expected.
+# RUN: rm -f %t1.a
+# RUN: llvm-ar rc %t1.a
+
+# RUN: llvm-size -B %t1.a | count 0
+## Sysv output prints a single blank line in this case.
+# RUN: llvm-size -A %t1.a | FileCheck %s --implicit-check-not={{.}}
+
+## Case 2: Single member.
+# RUN: rm -f %t2.a
+# RUN: llvm-ar rc %t2.a %t1
+
+# RUN: llvm-size -B %t2.a | FileCheck %s -DARCHIVE=%t2.a --check-prefix=BERKELEY-1
+# RUN: llvm-size -A %t2.a | FileCheck %s -DARCHIVE=%t2.a --check-prefix=SYSV-1
+
+## Case 3: Multiple members.
+# RUN: rm -f %t3.a
+# RUN: llvm-ar rc %t3.a %t1 %t2
+
+# RUN: llvm-size -B %t3.a | FileCheck %s -DARCHIVE=%t3.a --check-prefixes=BERKELEY-1,BERKELEY-2
+# RUN: llvm-size -A %t3.a | FileCheck %s -DARCHIVE=%t3.a --check-prefixes=SYSV-1,SYSV-2
+
+## Case 4: Mixing archives and non-archives produces sensible output:
+# RUN: llvm-size -B %t1 %t2.a %t2 %t3.a \
+# RUN:   | FileCheck %s -DARCHIVE=%t3.a -DARCHIVE2=%t2.a -DFILE1=%t1 -DFILE2=%t2 \
+# RUN:                  --check-prefixes=BERKELEY-1,BERKELEY-2,BERKELEY-3
+# RUN: llvm-size -A %t1 %t2.a %t2 %t3.a \
+# RUN:   | FileCheck %s -DARCHIVE=%t3.a -DARCHIVE2=%t2.a -DFILE1=%t1 -DFILE2=%t2 \
+# RUN:                  --check-prefixes=SYSV-1,SYSV-2,SYSV-3
+
+# BERKELEY-1:     text    data     bss     dec     hex filename
+# BERKELEY-3-NEXT:   1       2       4       7       7 [[FILE1]]
+# BERKELEY-3-NEXT:   1       2       4       7       7 archive.test.tmp1 (ex [[ARCHIVE2]])
+# BERKELEY-3-NEXT:   8      16      32      56      38 [[FILE2]]
+# BERKELEY-1-NEXT:   1       2       4       7       7 archive.test.tmp1 (ex [[ARCHIVE]])
+# BERKELEY-2-NEXT:   8      16      32      56      38 archive.test.tmp2 (ex [[ARCHIVE]])
+# BERKELEY-1-NOT:{{.}}
+
+# SYSV-3:      [[FILE1]]  :
+# SYSV-3-NEXT: section     size   addr
+# SYSV-3-NEXT: .text          1      4
+# SYSV-3-NEXT: .data          2      2
+# SYSV-3-NEXT: .bss           4      1
+# SYSV-3-NEXT: Total          7
+# SYSV-3-EMPTY:
+# SYSV-3-NEXT: archive.test.tmp1   (ex [[ARCHIVE2]]):
+# SYSV-3-NEXT: section     size   addr
+# SYSV-3-NEXT: .text          1      4
+# SYSV-3-NEXT: .data          2      2
+# SYSV-3-NEXT: .bss           4      1
+# SYSV-3-NEXT: Total          7
+# SYSV-3-EMPTY:
+# SYSV-3-NEXT: [[FILE2]]  :
+# SYSV-3-NEXT: section     size   addr
+# SYSV-3-NEXT: .text          8      32
+# SYSV-3-NEXT: .data         16      16
+# SYSV-3-NEXT: .bss          32      8
+# SYSV-3-NEXT: Total         56
+# SYSV-3-EMPTY:
+
+# SYSV-1:      archive.test.tmp1   (ex [[ARCHIVE]]):
+# SYSV-1-NEXT: section     size   addr
+# SYSV-1-NEXT: .text          1      4
+# SYSV-1-NEXT: .data          2      2
+# SYSV-1-NEXT: .bss           4      1
+# SYSV-1-NEXT: Total          7
+
+# SYSV-2-NEXT: archive.test.tmp2   (ex [[ARCHIVE]]):
+# SYSV-2-NEXT: section     size   addr
+# SYSV-2-NEXT: .text          8      32
+# SYSV-2-NEXT: .data         16      16
+# SYSV-2-NEXT: .bss          32      8
+# SYSV-2-NEXT: Total         56
+# SYSV-1-NOT:{{.}}
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    1
+    Address: 4
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    2
+    Address: 2
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    4
+    Address: 1
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    8
+    Address: 32
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    16
+    Address: 16
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    32
+    Address: 8
diff --git a/llvm/test/tools/llvm-size/basic.test b/llvm/test/tools/llvm-size/basic.test
deleted file mode 100644 (file)
index c53d7e0..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-RUN: not llvm-size %t.blah 2>&1 | FileCheck --check-prefix=ENOENT %s
-ENOENT: {{.*}}llvm-size{{(\.EXE|\.exe)?}}: {{.*}}basic.test.tmp.blah {{[Nn]}}o such file or directory
diff --git a/llvm/test/tools/llvm-size/common.test b/llvm/test/tools/llvm-size/common.test
new file mode 100644 (file)
index 0000000..ac80477
--- /dev/null
@@ -0,0 +1,44 @@
+## Check that with the common switch common symbols are added to bss (Berkeley
+## output) or shown as *COM* (sysv output). Otherwise their size is ignored.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-size -A --common %t.o | FileCheck --check-prefix=SYSV %s
+# RUN: llvm-size -B --common %t.o | FileCheck --check-prefix=BSD %s
+# RUN: llvm-size -A %t.o | FileCheck --check-prefix=SYSVNOCOMM %s
+# RUN: llvm-size -B %t.o | FileCheck --check-prefix=BSDNOCOMM %s
+
+# SYSV:      {{.*}}.o  :
+# SYSV-NEXT: section     size   addr
+# SYSV-NEXT: .text          0      0
+# SYSV-NEXT: *COM*          8      0
+# SYSV-NEXT: Total          8
+
+# SYSVNOCOMM:      {{.*}}.o  :
+# SYSVNOCOMM-NEXT: section     size   addr
+# SYSVNOCOMM-NEXT: .text          0      0
+# SYSVNOCOMM-NEXT: Total          0
+
+# BSD:      text    data     bss     dec     hex filename
+# BSD-NEXT:    0       0       8       8       8 {{.*}}.o
+
+# BSDNOCOMM:      text    data     bss     dec     hex filename
+# BSDNOCOMM-NEXT:    0       0       0       0       0 {{.*}}.o
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name: .text
+    Type: SHT_PROGBITS
+Symbols:
+  - Name:  y
+    Type:  STT_OBJECT
+    Size:  4
+    Index: SHN_COMMON
+  - Name:  z
+    Type:  STT_OBJECT
+    Size:  4
+    Index: SHN_COMMON
index ade1b72..0788665 100644 (file)
-RUN: llvm-size -m %p/Inputs/darwin-m.o | FileCheck --check-prefix="DARWIN" %s
-RUN: llvm-size -m %p/Inputs/darwin-m.o %p/Inputs/darwin-m1.o | FileCheck --check-prefix="DARWIN2" %s
+## Show that -m/--format=darwin produces darwin-style output.
 
-DARWIN: Segment : 8
-DARWIN-NEXT:   Section (__TEXT, __text): 4
-DARWIN-NEXT:   Section (__DATA, __data): 4
-DARWIN-NEXT:   total 8
-DARWIN-NEXT: total 8
+# RUN: yaml2obj %s --docnum=1 -o %t
+# RUN: yaml2obj %s --docnum=2 -o %t2
+# RUN: llvm-size -m %t \
+# RUN:   | FileCheck --check-prefix=DARWIN %s --implicit-check-not={{.}} \
+# RUN:               --strict-whitespace --match-full-lines
+# RUN: llvm-size -m %t %t2 \
+# RUN:   | FileCheck --check-prefixes=DARWIN,DARWIN2 %s --implicit-check-not={{.}} \
+# RUN:               -DFILE1=%t -DFILE2=%t2 --strict-whitespace --match-full-lines
+# RUN: llvm-size --format=darwin %t \
+# RUN:   | FileCheck --check-prefix=DARWIN %s --implicit-check-not={{.}} \
+# RUN:               --strict-whitespace --match-full-lines
+# RUN: llvm-size --format=darwin %t %t2 \
+# RUN:   | FileCheck --check-prefixes=DARWIN,DARWIN2 %s --implicit-check-not={{.}} \
+# RUN:               -DFILE1=%t -DFILE2=%t2 --strict-whitespace --match-full-lines
 
-DARWIN2: Inputs/darwin-m.o:
-DARWIN2: Inputs/darwin-m1.o:
+#      DARWIN2:[[FILE1]]:
+#       DARWIN:Segment : 12
+#  DARWIN-NEXT:        Section (__TEXT, __text): 4
+#  DARWIN-NEXT:        Section (__DATA, __data): 8
+#  DARWIN-NEXT:        total 12
+#  DARWIN-NEXT:total 12
+#      DARWIN2:[[FILE2]]:
+# DARWIN2-NEXT:Segment : 48
+# DARWIN2-NEXT:        Section (__TEXT, __text): 16
+# DARWIN2-NEXT:        Section (__DATA, __data): 32
+# DARWIN2-NEXT:        total 48
+# DARWIN2-NEXT:total 48
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x0000000C
+  cpusubtype: 0x00000009
+  filetype:   0x00000001
+  ncmds:      1
+  sizeofcmds: 192
+  flags:      0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT
+    cmdsize:  192
+    segname:  ''
+    vmaddr:   0
+    vmsize:   12
+    fileoff:  220
+    filesize: 12
+    maxprot:  7
+    initprot: 7
+    nsects:   2
+    flags:    0
+    Sections:
+      - sectname:  __text
+        segname:   __TEXT
+        addr:      0x0000000000000000
+        size:      4
+        offset:    0x000000DC
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x80000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+      - sectname:  __data
+        segname:   __DATA
+        addr:      0x0000000000000004
+        size:      8
+        offset:    0x000000E0
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x0000000C
+  cpusubtype: 0x00000009
+  filetype:   0x00000001
+  ncmds:      1
+  sizeofcmds: 192
+  flags:      0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT
+    cmdsize:  192
+    segname:  ''
+    vmaddr:   0
+    vmsize:   48
+    fileoff:  220
+    filesize: 48
+    maxprot:  7
+    initprot: 7
+    nsects:   2
+    flags:    0
+    Sections:
+      - sectname:  __text
+        segname:   __TEXT
+        addr:      0x0000000000000000
+        size:      16
+        offset:    0x000000DC
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x80000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+      - sectname:  __data
+        segname:   __DATA
+        addr:      0x0000000000000010
+        size:      32
+        offset:    0x000000EC
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
diff --git a/llvm/test/tools/llvm-size/elf-berkeley.test b/llvm/test/tools/llvm-size/elf-berkeley.test
new file mode 100644 (file)
index 0000000..96eaca7
--- /dev/null
@@ -0,0 +1,66 @@
+## Show that llvm-sizes works correctly on a typical ELF input for Berkeley
+## format. It also shows that the formatting is correct (including using tabs as
+## field separators).
+
+# RUN: yaml2obj %s > %t.o
+
+# RUN: llvm-size -B %t.o \
+# RUN:   | FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t.o --implicit-check-not={{.}}
+# RUN: llvm-size --format=berkeley %t.o \
+# RUN:   | FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t.o --implicit-check-not={{.}}
+
+## Also show that the default output format is Berkeley.
+# RUN: llvm-size %t.o \
+# RUN:   | FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t.o --implicit-check-not={{.}}
+
+## text is .text, .eh_frame, .unusual_name_for_code: 2 + 4 + 64 = 70
+## data is .data, .init_array, .moar_stuff: 8 + 32 + 128 = 168
+## bss is .bss: 1
+## total: 239
+## unaccounted for (not affecting total) is .debug_info, .text.but_not_really
+#      CHECK:   text      data     bss     dec     hex filename
+# CHECK-NEXT:     70       168       1     239      ef [[FILE]]
+
+!ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name:  .bss
+    Type:  SHT_NOBITS
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+    Size:  1
+  - Name:  .text
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+    Size:  2
+  - Name:  .unusual_name_for_code
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+    Size:  64
+  - Name:  .eh_frame
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC ]
+    Size:  4
+  - Name:  .data
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+    Size:  8
+  - Name:  .moar_stuff
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+    Size:  128
+  - Name:  .text.but_not_really
+    Type:  SHT_PROGBITS
+    Flags: [ ]
+    Size:  256
+  - Name:  .debug_info
+    Type:  SHT_PROGBITS
+    Flags: [ ]
+    Size:  16
+  - Name:  .init_array
+    Type:  SHT_INIT_ARRAY
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+    Size:  32
diff --git a/llvm/test/tools/llvm-size/elf-m.test b/llvm/test/tools/llvm-size/elf-m.test
new file mode 100644 (file)
index 0000000..c18184f
--- /dev/null
@@ -0,0 +1,18 @@
+## Show that llvm-size falls back to Berkeley output if --format=darwin is
+## specified and the input is not Mach-O.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size -m %t | FileCheck %s
+# RUN: llvm-size --format=darwin %t | FileCheck %s
+
+## FIXME: The input filename should be printed but isn't currently due to
+##        https://bugs.llvm.org/show_bug.cgi?id=42971.
+# CHECK:         text    data     bss     dec     hex filename
+# CHECK-NEXT:       0       0       0       0       0
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-size/elf-sysv.test b/llvm/test/tools/llvm-size/elf-sysv.test
new file mode 100644 (file)
index 0000000..2ce909a
--- /dev/null
@@ -0,0 +1,129 @@
+## Show that llvm-sizes works correctly on a typical ELF input for sysv
+## format. It also shows that the formatting is correct.
+
+## FIXME: The rules demonstrated by this test are not quite what GNU size
+## follows. See https://bugs.llvm.org/show_bug.cgi?id=42934.
+
+# RUN: yaml2obj %s > %t.o
+# RUN: llvm-size --format=sysv %t.o \
+# RUN:   | FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t.o --implicit-check-not={{.}}
+# RUN: llvm-size -A %t.o \
+# RUN:   | FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t.o --implicit-check-not={{.}}
+
+#      CHECK:[[FILE]]  :
+# CHECK-NEXT:section               size      addr
+# CHECK-NEXT:.progbits                1   2097152
+# CHECK-NEXT:.symtab_shndx            4    524288
+# CHECK-NEXT:.hash                   64     65536
+# CHECK-NEXT:.dynamic               128     32768
+# CHECK-NEXT:.note                  256     16384
+# CHECK-NEXT:.nobits                512      8192
+# CHECK-NEXT:.shlib                2048      2048
+# CHECK-NEXT:.dynsym               4096      1024
+# CHECK-NEXT:.init_array           8192       512
+# CHECK-NEXT:.fini_array          16384       256
+# CHECK-NEXT:.preinit_array       32768       128
+# CHECK-NEXT:.group               65536        64
+# CHECK-NEXT:.relr               131072        32
+# CHECK-NEXT:.os_specific        262144        16
+# CHECK-NEXT:.proc_specific      524288         8
+# CHECK-NEXT:.user_specific     1048576         4
+# CHECK-NEXT:Total              2096069
+
+!ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .progbits
+    Type:    SHT_PROGBITS
+    ShSize:  0x1
+    Address: 0x200000
+  - Name:    .strtab
+    Type:    SHT_STRTAB
+    ShSize:  0x2
+    Address: 0x100000
+  - Name:    .symtab_shndx
+    Link:    .symtab
+    Type:    SHT_SYMTAB_SHNDX
+    ShSize:  0x4
+    Address: 0x80000
+    Entries:
+  - Name:    .symtab
+    Type:    SHT_SYMTAB
+    ## .symtab's size has to be based on .symtab_shndx's size, hence the
+    ## size not following the pattern of the other sections.
+    ShSize:  0x18
+    Address: 0x40000
+  - Name:    .rela
+    Type:    SHT_RELA
+    ShSize:  0x20
+    Address: 0x20000
+  - Name:    .hash
+    Type:    SHT_HASH
+    ShSize:  0x40
+    Address: 0x10000
+  - Name:    .dynamic
+    Type:    SHT_DYNAMIC
+    ShSize:  0x80
+    Address: 0x8000
+  - Name:    .note
+    Type:    SHT_NOTE
+    ShSize:  0x100
+    Address: 0x4000
+  - Name:    .nobits
+    Type:    SHT_NOBITS
+    ShSize:  0x200
+    Address: 0x2000
+  - Name:    .rel
+    Type:    SHT_REL
+    ShSize:  0x400
+    Address: 0x1000
+  - Name:    .shlib
+    Type:    SHT_SHLIB
+    ShSize:  0x800
+    Address: 0x800
+  - Name:    .dynsym
+    Type:    SHT_DYNSYM
+    ShSize:  0x1000
+    Address: 0x400
+  - Name:    .init_array
+    Type:    SHT_INIT_ARRAY
+    ShSize:  0x2000
+    Address: 0x200
+  - Name:    .fini_array
+    Type:    SHT_FINI_ARRAY
+    ShSize:  0x4000
+    Address: 0x100
+  - Name:    .preinit_array
+    Type:    SHT_PREINIT_ARRAY
+    ShSize:  0x8000
+    Address: 0x80
+  - Name:    .group
+    Type:    SHT_GROUP
+    ShSize:  0x10000
+    Address: 0x40
+    Info:    0
+    Members:
+  - Name:    .relr
+    Type:    SHT_RELR
+    ShSize:  0x20000
+    Address: 0x20
+  - Name:    .os_specific
+    Type:    0x61234567
+    ShSize:  0x40000
+    Address: 0x10
+  - Name:    .proc_specific
+    Type:    0x71234567
+    ShSize:  0x80000
+    Address: 0x8
+  - Name:    .user_specific
+    Type:    0x81234567
+    ShSize:  0x100000
+    Address: 0x4
+  - Name:    .null
+    Type:    SHT_NULL
+    ShSize:  0x200000
+    Address: 0x2
index a7bd6ed..6489134 100644 (file)
@@ -1,7 +1,15 @@
-RUN: llvm-size -h | FileCheck %s
-RUN: llvm-size --help | FileCheck %s
+## Show that help text is printed correctly when requested.
+
+RUN: llvm-size -h | FileCheck %s --check-prefixes=CHECK,CATEG
+RUN: llvm-size --help | FileCheck %s --check-prefixes=CHECK,CATEG
+RUN: llvm-size --help-list \
+RUN:   | FileCheck %s --check-prefixes=CHECK,LIST
 
 CHECK: OVERVIEW: llvm object size dumper
 CHECK: USAGE: llvm-size{{(.exe)?}} [options] <input files>{{$}}
 CHECK: OPTIONS:
+CATEG:    Generic Options:
+LIST-NOT: Generic Options:
+CATEG:    llvm-size Options:
+LIST-NOT: llvm-size Options:
 CHECK: @FILE
diff --git a/llvm/test/tools/llvm-size/invalid-input.test b/llvm/test/tools/llvm-size/invalid-input.test
new file mode 100644 (file)
index 0000000..a27c780
--- /dev/null
@@ -0,0 +1,22 @@
+## Show that llvm-size reports an error when passed an input file in an
+## unknown format.
+
+## FIXME: The error messages tested here are not consistently formatted, and the
+##        second one doesn't even return with a non-zero exit code.
+##        See https://bugs.llvm.org/show_bug.cgi?id=42970.
+
+# RUN: not llvm-size %s 2>&1 | FileCheck %s -DFILE=%s --check-prefix=UNRECOGNIZED
+# UNRECOGNIZED: {{.*}}llvm-size{{(.*)}}: [[FILE]] The file was not recognized as a valid object file
+
+## Show that llvm-size reports an error when passed an input file in an
+## unsupported format.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=NOTSUPPORTED
+# NOTSUPPORTED: {{.*}}llvm-size{{(.*)}}: [[FILE]]: Unrecognized file type.
+
+--- !minidump
+Streams:
+  - Type:    LinuxAuxv
+    Size:    7
+    Content: 11223344556600
diff --git a/llvm/test/tools/llvm-size/long-format.test b/llvm/test/tools/llvm-size/long-format.test
new file mode 100644 (file)
index 0000000..1b69129
--- /dev/null
@@ -0,0 +1,58 @@
+## Show that the -l option produces more verbose address and offset information
+## for darwin format.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size %t -m -l | FileCheck %s
+
+# CHECK:      Segment : 12 (vmaddr 0x0 fileoff 220)
+# CHECK-NEXT:         Section (__TEXT, __text): 4 (addr 0x0 offset 220)
+# CHECK-NEXT:         Section (__DATA, __data): 8 (addr 0x4 offset 224)
+# CHECK-NEXT:         total 12
+# CHECK-NEXT: total 12
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x0000000C
+  cpusubtype: 0x00000009
+  filetype:   0x00000001
+  ncmds:      1
+  sizeofcmds: 192
+  flags:      0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT
+    cmdsize:  192
+    segname:  ''
+    vmaddr:   0
+    vmsize:   12
+    fileoff:  220
+    filesize: 12
+    maxprot:  7
+    initprot: 7
+    nsects:   2
+    flags:    0
+    Sections:
+      - sectname:  __text
+        segname:   __TEXT
+        addr:      0x0000000000000000
+        size:      4
+        offset:    0x000000DC
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x80000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+      - sectname:  __data
+        segname:   __DATA
+        addr:      0x0000000000000004
+        size:      8
+        offset:    0x000000E0
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
diff --git a/llvm/test/tools/llvm-size/macho-berkeley.test b/llvm/test/tools/llvm-size/macho-berkeley.test
new file mode 100644 (file)
index 0000000..6e34b25
--- /dev/null
@@ -0,0 +1,55 @@
+## Show that llvm-size can print Mach-O files using berkeley-style output.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size %t -B \
+# RUN:   | FileCheck %s --implicit-check-not={{.}} --strict-whitespace
+
+# CHECK:      __TEXT   __DATA  __OBJC  others  dec     hex
+# CHECK-NEXT: 4        8       0       0       12      c       {{$}}
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x0000000C
+  cpusubtype: 0x00000009
+  filetype:   0x00000001
+  ncmds:      1
+  sizeofcmds: 192
+  flags:      0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT
+    cmdsize:  192
+    segname:  ''
+    vmaddr:   0
+    vmsize:   12
+    fileoff:  220
+    filesize: 12
+    maxprot:  7
+    initprot: 7
+    nsects:   2
+    flags:    0
+    Sections:
+      - sectname:  __text
+        segname:   __TEXT
+        addr:      0x0000000000000000
+        size:      4
+        offset:    0x000000DC
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x80000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+      - sectname:  __data
+        segname:   __DATA
+        addr:      0x0000000000000004
+        size:      8
+        offset:    0x000000E0
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
diff --git a/llvm/test/tools/llvm-size/macho-sysv.test b/llvm/test/tools/llvm-size/macho-sysv.test
new file mode 100644 (file)
index 0000000..83f914c
--- /dev/null
@@ -0,0 +1,58 @@
+## Show that llvm-size can print Mach-O files using sysv-style output.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size %t -A \
+# RUN:   | FileCheck %s --implicit-check-not={{.}} --strict-whitespace -DFILE=%t
+
+# CHECK:      [[FILE]]  :
+# CHECK-NEXT: section     size   addr
+# CHECK-NEXT: __text         4      0
+# CHECK-NEXT: __data         8      4
+# CHECK-NEXT: Total         12
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x0000000C
+  cpusubtype: 0x00000009
+  filetype:   0x00000001
+  ncmds:      1
+  sizeofcmds: 192
+  flags:      0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT
+    cmdsize:  192
+    segname:  ''
+    vmaddr:   0
+    vmsize:   12
+    fileoff:  220
+    filesize: 12
+    maxprot:  7
+    initprot: 7
+    nsects:   2
+    flags:    0
+    Sections:
+      - sectname:  __text
+        segname:   __TEXT
+        addr:      0x0000000000000000
+        size:      4
+        offset:    0x000000DC
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x80000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+      - sectname:  __data
+        segname:   __DATA
+        addr:      0x0000000000000004
+        size:      8
+        offset:    0x000000E0
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
diff --git a/llvm/test/tools/llvm-size/multiple-inputs.test b/llvm/test/tools/llvm-size/multiple-inputs.test
new file mode 100644 (file)
index 0000000..96c3c21
--- /dev/null
@@ -0,0 +1,72 @@
+## Show how llvm-size behaves when passed in multiple inputs.
+
+# RUN: yaml2obj %s --docnum=1 -o %t1
+# RUN: yaml2obj %s --docnum=2 -o %t2
+# RUN: llvm-size -B %t1 %t2 | FileCheck %s -DFILE1=%t1 -DFILE2=%t2 --check-prefix=BERKELEY
+# RUN: llvm-size -A %t1 %t2 | FileCheck %s -DFILE1=%t1 -DFILE2=%t2 --check-prefix=SYSV
+
+# BERKELEY:     text    data     bss     dec     hex filename
+# BERKELEY-NEXT:   1       2       4       7       7 [[FILE1]]
+# BERKELEY-NEXT:   8      16      32      56      38 [[FILE2]]
+# BERKELEY-NOT:{{.}}
+
+# SYSV:      [[FILE1]]  :
+# SYSV-NEXT: section     size   addr
+# SYSV-NEXT: .text          1      4
+# SYSV-NEXT: .data          2      2
+# SYSV-NEXT: .bss           4      1
+# SYSV-NEXT: Total          7
+# SYSV-EMPTY:
+# SYSV-NEXT: [[FILE2]]  :
+# SYSV-NEXT: section     size   addr
+# SYSV-NEXT: .text          8     32
+# SYSV-NEXT: .data         16     16
+# SYSV-NEXT: .bss          32      8
+# SYSV-NEXT: Total         56
+# SYSV-NOT:{{.}}
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    1
+    Address: 4
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    2
+    Address: 2
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    4
+    Address: 1
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    8
+    Address: 32
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    16
+    Address: 16
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    32
+    Address: 8
diff --git a/llvm/test/tools/llvm-size/no-input.test b/llvm/test/tools/llvm-size/no-input.test
new file mode 100644 (file)
index 0000000..d4a145f
--- /dev/null
@@ -0,0 +1,26 @@
+## Show that llvm-size emits an error if passed in a non-existent file.
+
+# RUN: not llvm-size %t.blah 2>&1 | FileCheck %s -DFILE=%t.blah --check-prefix=ENOENT
+# ENOENT: {{.*}}llvm-size{{.*}}: [[FILE]] {{[Nn]}}o such file or directory
+
+## Show that llvm-size reads a.out if not passed any file.
+
+# RUN: rm -rf %t && mkdir -p %t
+# RUN: cd %t
+# RUN: yaml2obj %s -o a.out
+# RUN: llvm-size 2>&1 | FileCheck %s -DFILE=a.out
+
+# CHECK:         text    data     bss     dec     hex filename
+# CHECK-NEXT:      42       0       0      42      2a a.out
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:  .text
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+    Size:  42
diff --git a/llvm/test/tools/llvm-size/radix.test b/llvm/test/tools/llvm-size/radix.test
new file mode 100644 (file)
index 0000000..e8fea8b
--- /dev/null
@@ -0,0 +1,167 @@
+## Show that llvm-size prints sizes in different radixes when requested.
+
+# RUN: yaml2obj %s --docnum=1 -o %t1.o
+# RUN: yaml2obj %s --docnum=2 -o %t2.o
+
+## Case 1: Octal radix (Berkeley).
+# RUN: llvm-size %t1.o %t2.o --totals -B --radix=8 \
+# RUN:   | FileCheck %s --check-prefix=OCT-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+# RUN: llvm-size %t1.o %t2.o --totals -B -o \
+# RUN:   | FileCheck %s --check-prefix=OCT-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+
+# OCT-BERK:         text    data     bss     oct     hex filename
+# OCT-BERK-NEXT:      01      02      04       7       7 [[FILE1]]
+# OCT-BERK-NEXT:     010     020     040      70      38 [[FILE2]]
+# OCT-BERK-NEXT:     011     022     044      77      3f (TOTALS)
+
+## Case 2: Decimal radix (Berkeley).
+# RUN: llvm-size %t1.o %t2.o --totals -B --radix=10 \
+# RUN:   | FileCheck %s --check-prefix=DEC-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+# RUN: llvm-size %t1.o %t2.o --totals -B -d \
+# RUN:   | FileCheck %s --check-prefix=DEC-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+
+# DEC-BERK:         text    data     bss     dec     hex filename
+# DEC-BERK-NEXT:       1       2       4       7       7 [[FILE1]]
+# DEC-BERK-NEXT:       8      16      32      56      38 [[FILE2]]
+# DEC-BERK-NEXT:       9      18      36      63      3f (TOTALS)
+
+## Case 3: Hexadecimal radix (Berkeley).
+# RUN: llvm-size %t1.o %t2.o --totals -B --radix=16 \
+# RUN:   | FileCheck %s --check-prefix=HEX-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+# RUN: llvm-size %t1.o %t2.o --totals -B -x \
+# RUN:   | FileCheck %s --check-prefix=HEX-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+
+# HEX-BERK:         text    data     bss     dec     hex filename
+# HEX-BERK-NEXT:     0x1     0x2     0x4       7       7 [[FILE1]]
+# HEX-BERK-NEXT:     0x8    0x10    0x20      56      38 [[FILE2]]
+# HEX-BERK-NEXT:     0x9    0x12    0x24      63      3f (TOTALS)
+
+## Case 4: Octal radix (sysv).
+# RUN: llvm-size %t1.o %t2.o -A --radix=8 \
+# RUN:   | FileCheck %s --check-prefix=OCT-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+# RUN: llvm-size %t1.o %t2.o -A -o \
+# RUN:   | FileCheck %s --check-prefix=OCT-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+
+# OCT-SYSV:      [[FILE1]]  :
+# OCT-SYSV-NEXT: section     size   addr
+# OCT-SYSV-NEXT: .text         01     04
+# OCT-SYSV-NEXT: .data         02     02
+# OCT-SYSV-NEXT: .bss          04     01
+# OCT-SYSV-NEXT: Total         07
+# OCT-SYSV-EMPTY:
+# OCT-SYSV-NEXT: [[FILE2]]  :
+# OCT-SYSV-NEXT: section     size   addr
+# OCT-SYSV-NEXT: .blob        010    040
+# OCT-SYSV-NEXT: .blab        020    020
+# OCT-SYSV-NEXT: .blib        040    010
+# OCT-SYSV-NEXT: Total        070
+
+## Case 5: Decimal radix (sysv).
+# RUN: llvm-size %t1.o %t2.o -A --radix=10 \
+# RUN:   | FileCheck %s --check-prefix=DEC-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+# RUN: llvm-size %t1.o %t2.o -A -d \
+# RUN:   | FileCheck %s --check-prefix=DEC-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+
+# DEC-SYSV:      [[FILE1]]  :
+# DEC-SYSV-NEXT: section     size   addr
+# DEC-SYSV-NEXT: .text          1      4
+# DEC-SYSV-NEXT: .data          2      2
+# DEC-SYSV-NEXT: .bss           4      1
+# DEC-SYSV-NEXT: Total          7
+# DEC-SYSV-EMPTY:
+# DEC-SYSV-NEXT: [[FILE2]]  :
+# DEC-SYSV-NEXT: section     size   addr
+# DEC-SYSV-NEXT: .blob          8     32
+# DEC-SYSV-NEXT: .blab         16     16
+# DEC-SYSV-NEXT: .blib         32      8
+# DEC-SYSV-NEXT: Total         56
+
+## Case 6: Hexadecimal radix (sysv).
+# RUN: llvm-size %t1.o %t2.o -A --radix=16 \
+# RUN:   | FileCheck %s --check-prefix=HEX-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+# RUN: llvm-size %t1.o %t2.o -A -x \
+# RUN:   | FileCheck %s --check-prefix=HEX-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+
+# HEX-SYSV:      [[FILE1]]  :
+# HEX-SYSV-NEXT: section     size   addr
+# HEX-SYSV-NEXT: .text        0x1    0x4
+# HEX-SYSV-NEXT: .data        0x2    0x2
+# HEX-SYSV-NEXT: .bss         0x4    0x1
+# HEX-SYSV-NEXT: Total        0x7
+# HEX-SYSV-EMPTY:
+# HEX-SYSV-NEXT: [[FILE2]]  :
+# HEX-SYSV-NEXT: section     size   addr
+# HEX-SYSV-NEXT: .blob        0x8   0x20
+# HEX-SYSV-NEXT: .blab       0x10   0x10
+# HEX-SYSV-NEXT: .blib       0x20    0x8
+# HEX-SYSV-NEXT: Total       0x38
+
+## Case 7: Default Berkeley is decimal.
+# RUN: llvm-size %t1.o %t2.o --totals -B \
+# RUN:   | FileCheck %s --check-prefix=DEC-BERK -DFILE1=%t1.o -DFILE2=%t2.o
+
+## Case 8: Default sysv is decimal.
+# RUN: llvm-size %t1.o %t2.o -A \
+# RUN:   | FileCheck %s --check-prefix=DEC-SYSV -DFILE1=%t1.o -DFILE2=%t2.o
+
+## Case 9: Bad values.
+# RUN: not llvm-size %t1.o --radix=0 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=BAD-VAL -DNUM=0
+# RUN: not llvm-size %t1.o --radix=1 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=BAD-VAL -DNUM=1
+# RUN: not llvm-size %t1.o --radix=2 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=BAD-VAL -DNUM=2
+# RUN: not llvm-size %t1.o --radix=32 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=BAD-VAL -DNUM=32
+# RUN: not llvm-size %t1.o --radix=-1 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=BAD-VAL -DNUM=-1
+# RUN: not llvm-size %t1.o --radix=bad 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=BAD-VAL -DNUM=bad
+
+# BAD-VAL: {{.*}}llvm-size{{.*}}: for the --radix option: Cannot find option named '[[NUM]]'!
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    1
+    Address: 4
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    2
+    Address: 2
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    4
+    Address: 1
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .blob
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    8
+    Address: 32
+  - Name:    .blab
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    16
+    Address: 16
+  - Name:    .blib
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    32
+    Address: 8
diff --git a/llvm/test/tools/llvm-size/response-file.test b/llvm/test/tools/llvm-size/response-file.test
new file mode 100644 (file)
index 0000000..694901e
--- /dev/null
@@ -0,0 +1,21 @@
+## Show that llvm-size can consume a response file.
+
+# RUN: echo "-t %t" > %t.rsp
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size -x @%t.rsp | FileCheck %s -DFILE=%t
+
+# CHECK:         text    data     bss     dec     hex filename
+# CHECK-NEXT:    0x10       0       0      16      10 [[FILE]]
+# CHECK-NEXT:    0x10       0       0      16      10 (TOTALS)
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name:  .text
+    Type:  SHT_PROGBITS
+    Size:  0x10
+    Flags: [SHF_ALLOC, SHF_EXECINSTR]
diff --git a/llvm/test/tools/llvm-size/stdin.test b/llvm/test/tools/llvm-size/stdin.test
new file mode 100644 (file)
index 0000000..551263b
--- /dev/null
@@ -0,0 +1,31 @@
+## Show that llvm-size reads stdin if the input file is '-'.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-size -B - < %t | FileCheck %s --check-prefix=BERKELEY
+# RUN: llvm-size -A - < %t | FileCheck %s --check-prefix=SYSV
+
+# BERKELEY: 1 2 4 7 7 <stdin>
+# SYSV:      <stdin>  :
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    1
+    Address: 4
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    2
+    Address: 2
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    4
+    Address: 1
diff --git a/llvm/test/tools/llvm-size/totals.test b/llvm/test/tools/llvm-size/totals.test
new file mode 100644 (file)
index 0000000..6f97dc1
--- /dev/null
@@ -0,0 +1,57 @@
+## Show that llvm-size prints the total sizes when --totals is specified.
+
+# RUN: rm -f %t.a
+# RUN: yaml2obj %s --docnum=1 -o %t.o
+# RUN: yaml2obj %s --docnum=2 -o %t2.o
+# RUN: llvm-ar rc %t.a %t.o %t2.o
+# RUN: llvm-size --totals %t.o %t.a %t2.o \
+# RUN:   | FileCheck %s -DFILE1=%t.o -DFILE2=%t2.o -DARCHIVE=%t.a
+# RUN: llvm-size -t %t.o %t.a %t2.o \
+# RUN:   | FileCheck %s -DFILE1=%t.o -DFILE2=%t2.o -DARCHIVE=%t.a
+
+# CHECK:         text    data     bss     dec     hex filename
+# CHECK-NEXT: [[FILE1]]
+# CHECK-NEXT: {{.*}}.o (ex [[ARCHIVE]])
+# CHECK-NEXT: {{.*}}2.o (ex [[ARCHIVE]])
+# CHECK-NEXT: [[FILE2]]
+# CHECK-NEXT:      18      36      72     126      7e (TOTALS)
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    1
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    2
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    4
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:    .text
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Size:    8
+  - Name:    .data
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    16
+  - Name:    .bss
+    Type:    SHT_NOBITS
+    Flags:   [SHF_ALLOC, SHF_WRITE]
+    Size:    32
diff --git a/llvm/test/tools/llvm-size/unknown-format.test b/llvm/test/tools/llvm-size/unknown-format.test
new file mode 100644 (file)
index 0000000..28ab8bf
--- /dev/null
@@ -0,0 +1,4 @@
+## Show that the an error is emitted if an unknown value is passed to --format.
+
+# RUN: not llvm-size --format=unknown 2>&1 | FileCheck %s
+# CHECK: {{.*}}llvm-size{{.*}}: for the --format option: Cannot find option named 'unknown'!
diff --git a/llvm/test/tools/llvm-size/version.test b/llvm/test/tools/llvm-size/version.test
new file mode 100644 (file)
index 0000000..dccd87a
--- /dev/null
@@ -0,0 +1,4 @@
+## Show that --version works for llvm-size.
+
+RUN: llvm-size --version | FileCheck %s
+CHECK: version