From b9ec4c6cea629ecf177d9d56640e1b87bdd8befc Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Thu, 7 Jan 2016 23:18:29 +0000 Subject: [PATCH] WebAssembly: use .skip instead of .zero directive .zero is confusing when used with two arguments. Documentation: This directive emits SIZE 0-valued bytes. SIZE must be an absolute expression. This directive is actually an alias for the '.skip' directive so in can take an optional second argument of the value to store in the bytes instead of zero. Using '.zero' in this way would be confusing however. Ref: https://sourceware.org/bugzilla/show_bug.cgi?id=18353 Hexagon and Sparc do the same, and it's all the same to WebAssembly so let's pick the less confusing of the two. llvm-svn: 257111 --- .../WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp | 4 ++++ llvm/test/CodeGen/WebAssembly/global.ll | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp index b1ab3ef29d86..02c717a92101 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp @@ -29,6 +29,10 @@ WebAssemblyMCAsmInfo::WebAssemblyMCAsmInfo(const Triple &T) { UseDataRegionDirectives = true; + // Use .skip instead of .zero because .zero is confusing when used with two + // arguments (it doesn't actually zero things out). + ZeroDirective = "\t.skip\t"; + Data8bitsDirective = "\t.int8\t"; Data16bitsDirective = "\t.int16\t"; Data32bitsDirective = "\t.int32\t"; diff --git a/llvm/test/CodeGen/WebAssembly/global.ll b/llvm/test/CodeGen/WebAssembly/global.ll index 29c47e1e8e92..f2bb8e7deac8 100644 --- a/llvm/test/CodeGen/WebAssembly/global.ll +++ b/llvm/test/CodeGen/WebAssembly/global.ll @@ -37,7 +37,7 @@ define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) { @g = private global i32 1337 ; CHECK-LABEL: ud: -; CHECK-NEXT: .zero 4{{$}} +; CHECK-NEXT: .skip 4{{$}} ; CHECK-NEXT: .size ud, 4{{$}} @ud = internal global i32 undef @@ -73,7 +73,7 @@ define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) { ; CHECK: .type ud64,@object ; CHECK: .align 3{{$}} ; CHECK-NEXT: ud64: -; CHECK-NEXT: .zero 8{{$}} +; CHECK-NEXT: .skip 8{{$}} ; CHECK-NEXT: .size ud64, 8{{$}} @ud64 = internal global i64 undef @@ -102,7 +102,7 @@ define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) { ; CHECK: .type f32ud,@object ; CHECK: .align 2{{$}} ; CHECK-NEXT: f32ud: -; CHECK-NEXT: .zero 4{{$}} +; CHECK-NEXT: .skip 4{{$}} ; CHECK-NEXT: .size f32ud, 4{{$}} @f32ud = internal global float undef @@ -131,7 +131,7 @@ define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) { ; CHECK: .type f64ud,@object ; CHECK: .align 3{{$}} ; CHECK-NEXT: f64ud: -; CHECK-NEXT: .zero 8{{$}} +; CHECK-NEXT: .skip 8{{$}} ; CHECK-NEXT: .size f64ud, 8{{$}} @f64ud = internal global double undef @@ -172,6 +172,6 @@ define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) { ; CHECK: .globl rom{{$}} ; CHECK: .align 4{{$}} ; CHECK: rom: -; CHECK: .zero 512{{$}} +; CHECK: .skip 512{{$}} ; CHECK: .size rom, 512{{$}} @rom = constant [128 x i32] zeroinitializer, align 16