As discussed in D85414 <https://reviews.llvm.org/D85414>, two tests currently `FAIL` on Sparc since that backend uses the Sun assembler syntax for the `.section` directive, controlled by `SunStyleELFSectionSwitchSyntax`. Instead of adapting the affected tests, this patch changes that default. The internal assembler still accepts both forms as input, only the output syntax is affected. Current support for the Sun syntax is cursory at best: the built-in assembler cannot even assemble some of the directives emitted by GCC, and the set supported by the Solaris assembler is even larger: SPARC Assembly Language Reference Manual, 3.4 Pseudo-Op Attributes <https://docs.oracle.com/cd/E37838_01/html/E61063/gmabi.html#scrolltoc>. A few Sparc test cases need to be adjusted. At the same time, the patch fixes the failures from D85414 <https://reviews.llvm.org/D85414>. Tested on `sparcv9-sun-solaris2.11`. Differential Revision: https://reviews.llvm.org/D85415
70 lines
2.4 KiB
C++
70 lines
2.4 KiB
C++
//===- SparcMCAsmInfo.cpp - Sparc asm properties --------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the declarations of the SparcMCAsmInfo properties.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "SparcMCAsmInfo.h"
|
|
#include "SparcMCExpr.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/BinaryFormat/Dwarf.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/MC/MCTargetOptions.h"
|
|
|
|
using namespace llvm;
|
|
|
|
void SparcELFMCAsmInfo::anchor() {}
|
|
|
|
SparcELFMCAsmInfo::SparcELFMCAsmInfo(const Triple &TheTriple) {
|
|
bool isV9 = (TheTriple.getArch() == Triple::sparcv9);
|
|
IsLittleEndian = (TheTriple.getArch() == Triple::sparcel);
|
|
|
|
if (isV9) {
|
|
CodePointerSize = CalleeSaveStackSlotSize = 8;
|
|
}
|
|
|
|
Data16bitsDirective = "\t.half\t";
|
|
Data32bitsDirective = "\t.word\t";
|
|
// .xword is only supported by V9.
|
|
Data64bitsDirective = (isV9) ? "\t.xword\t" : nullptr;
|
|
ZeroDirective = "\t.skip\t";
|
|
CommentString = "!";
|
|
SupportsDebugInformation = true;
|
|
|
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
|
|
|
UsesELFSectionDirectiveForBSS = true;
|
|
}
|
|
|
|
const MCExpr*
|
|
SparcELFMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
|
|
unsigned Encoding,
|
|
MCStreamer &Streamer) const {
|
|
if (Encoding & dwarf::DW_EH_PE_pcrel) {
|
|
MCContext &Ctx = Streamer.getContext();
|
|
return SparcMCExpr::create(SparcMCExpr::VK_Sparc_R_DISP32,
|
|
MCSymbolRefExpr::create(Sym, Ctx), Ctx);
|
|
}
|
|
|
|
return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer);
|
|
}
|
|
|
|
const MCExpr*
|
|
SparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
|
|
unsigned Encoding,
|
|
MCStreamer &Streamer) const {
|
|
if (Encoding & dwarf::DW_EH_PE_pcrel) {
|
|
MCContext &Ctx = Streamer.getContext();
|
|
return SparcMCExpr::create(SparcMCExpr::VK_Sparc_R_DISP32,
|
|
MCSymbolRefExpr::create(Sym, Ctx), Ctx);
|
|
}
|
|
return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer);
|
|
}
|