From e1f835ab596a984f5d055ca98db375b72ddd7f14 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Tue, 28 Apr 2015 01:37:11 +0000 Subject: [PATCH] [MC] Use LShr for constant evaluation of ">>" on ELF/arm64--darwin. This matches other assemblers and is less unexpected (e.g. PR23227). On ELF, I tried binutils gas v2.24 and nasm 2.10.09, and they both agree on LShr. On COFF, I couldn't get my hands on an assembler yet, so don't change the behavior. For now, don't change it on non-AArch64 Darwin either, as the other assembler is gas v1.38, which does an AShr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235963 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCAsmInfo.cpp | 2 +- lib/MC/MCAsmInfoCOFF.cpp | 4 ++++ lib/MC/MCAsmInfoDarwin.cpp | 5 +++++ .../AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp | 4 ++++ test/MC/AArch64/expr-shr.s | 8 ++++++++ test/MC/ARM/bracket-exprs.s | 2 +- test/MC/AsmParser/expr-shr.s | 13 +++++++++++++ test/MC/ELF/bracket-exprs.s | 2 +- 8 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 test/MC/AArch64/expr-shr.s create mode 100644 test/MC/AsmParser/expr-shr.s diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index 22de8bd13dc..1a45b5a389f 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -90,7 +90,7 @@ MCAsmInfo::MCAsmInfo() { DwarfRegNumForCFI = false; NeedsDwarfSectionOffsetDirective = false; UseParensForSymbolVariant = false; - UseLogicalShr = false; + UseLogicalShr = true; // FIXME: Clang's logic should be synced with the logic used to initialize // this member and the two implementations should be merged. diff --git a/lib/MC/MCAsmInfoCOFF.cpp b/lib/MC/MCAsmInfoCOFF.cpp index bb3f0d3a429..97fc76a9adb 100644 --- a/lib/MC/MCAsmInfoCOFF.cpp +++ b/lib/MC/MCAsmInfoCOFF.cpp @@ -36,6 +36,10 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() { NeedsDwarfSectionOffsetDirective = true; UseIntegratedAssembler = true; + + // FIXME: For now keep the previous behavior, AShr. Need to double-check + // other COFF-targeting assemblers and change this if necessary. + UseLogicalShr = false; } void MCAsmInfoMicrosoft::anchor() { } diff --git a/lib/MC/MCAsmInfoDarwin.cpp b/lib/MC/MCAsmInfoDarwin.cpp index ae9486d3db4..bb90ff2c350 100644 --- a/lib/MC/MCAsmInfoDarwin.cpp +++ b/lib/MC/MCAsmInfoDarwin.cpp @@ -93,4 +93,9 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { UseIntegratedAssembler = true; SetDirectiveSuppressesReloc = true; + + // FIXME: For now keep the previous behavior, AShr, matching the previous + // behavior of as(1) (both -q and -Q: resp. LLVM and gas v1.38). + // If/when this changes, the AArch64 Darwin special case can go away. + UseLogicalShr = false; } diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp b/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp index f048474fd4a..c4122040041 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp +++ b/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp @@ -48,6 +48,10 @@ AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin() { UseDataRegionDirectives = true; ExceptionsType = ExceptionHandling::DwarfCFI; + + // AArch64 Darwin doesn't have the baggage of X86/ARM, so it's fine to use + // LShr instead of AShr. + UseLogicalShr = true; } const MCExpr *AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol( diff --git a/test/MC/AArch64/expr-shr.s b/test/MC/AArch64/expr-shr.s new file mode 100644 index 00000000000..aa23878e5ad --- /dev/null +++ b/test/MC/AArch64/expr-shr.s @@ -0,0 +1,8 @@ +// RUN: llvm-mc -triple aarch64-unknown-unknown-elf %s | FileCheck %s --check-prefix=ELF +// RUN: llvm-mc -triple aarch64-unknown-darwin %s | FileCheck %s --check-prefix=DARWIN + +.data + +// ELF: .xword 3 +// DARWIN: .quad 3 +.quad (~0 >> 62) diff --git a/test/MC/ARM/bracket-exprs.s b/test/MC/ARM/bracket-exprs.s index 922bf703701..74f3323cd2d 100644 --- a/test/MC/ARM/bracket-exprs.s +++ b/test/MC/ARM/bracket-exprs.s @@ -1,7 +1,7 @@ // RUN: llvm-mc -triple arm-unknown-linux %s | FileCheck %s // CHECK: .byte 1 -.if [~0 >> 1] == -1 +.if [~0 >> 63] == 1 .byte 1 .else .byte 2 diff --git a/test/MC/AsmParser/expr-shr.s b/test/MC/AsmParser/expr-shr.s new file mode 100644 index 00000000000..fc117b64e95 --- /dev/null +++ b/test/MC/AsmParser/expr-shr.s @@ -0,0 +1,13 @@ +// RUN: llvm-mc -triple x86_64-unknown-unknown-elf %s | FileCheck %s --check-prefix=CHECK +// RUN: llvm-mc -triple x86_64-pc-windows-msvc %s | FileCheck %s --check-prefix=MSVC +// RUN: llvm-mc -triple x86_64-unknown-darwin %s | FileCheck %s --check-prefix=DARWIN + +.data + +// CHECK: .quad 3 + +// Both COFF and Darwin still use AShr. +// MSVC: .quad -1 +// DARWIN: .quad -1 + +.quad (~0 >> 62) diff --git a/test/MC/ELF/bracket-exprs.s b/test/MC/ELF/bracket-exprs.s index 96f9f9aa450..e7299fde700 100644 --- a/test/MC/ELF/bracket-exprs.s +++ b/test/MC/ELF/bracket-exprs.s @@ -1,7 +1,7 @@ // RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s // CHECK: .byte 1 -.if [~0 >> 1] == -1 +.if [~0 >> 63] == 1 .byte 1 .else .byte 2