As the actual MSVC toolset doesn't use the GAS-style assembly that Clang/LLVM produces and consumes, there's no reference for what string to use for e.g. comments when building with a MSVC triple. This frees up the use of semicolon as separator string, just like was done for GNU targets in 23413195649d0cf6f3860ae8b5fb115b35032075. (Previously, both the separator and comment strings were set to the same, a semicolon.) Compiler-rt extensively uses separator chars in its assembly, and that assembly should be buildable with clang-cl for MSVC too. Differential Revision: https://reviews.llvm.org/D96259
135 lines
4.1 KiB
C++
135 lines
4.1 KiB
C++
//===-- AArch64MCAsmInfo.cpp - AArch64 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 AArch64MCAsmInfo properties.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "AArch64MCAsmInfo.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
using namespace llvm;
|
|
|
|
enum AsmWriterVariantTy {
|
|
Default = -1,
|
|
Generic = 0,
|
|
Apple = 1
|
|
};
|
|
|
|
static cl::opt<AsmWriterVariantTy> AsmWriterVariant(
|
|
"aarch64-neon-syntax", cl::init(Default),
|
|
cl::desc("Choose style of NEON code to emit from AArch64 backend:"),
|
|
cl::values(clEnumValN(Generic, "generic", "Emit generic NEON assembly"),
|
|
clEnumValN(Apple, "apple", "Emit Apple-style NEON assembly")));
|
|
|
|
AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin(bool IsILP32) {
|
|
// We prefer NEON instructions to be printed in the short, Apple-specific
|
|
// form when targeting Darwin.
|
|
AssemblerDialect = AsmWriterVariant == Default ? Apple : AsmWriterVariant;
|
|
|
|
PrivateGlobalPrefix = "L";
|
|
PrivateLabelPrefix = "L";
|
|
SeparatorString = "%%";
|
|
CommentString = ";";
|
|
CalleeSaveStackSlotSize = 8;
|
|
CodePointerSize = IsILP32 ? 4 : 8;
|
|
|
|
AlignmentIsInBytes = false;
|
|
UsesELFSectionDirectiveForBSS = true;
|
|
SupportsDebugInformation = true;
|
|
UseDataRegionDirectives = true;
|
|
|
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
|
}
|
|
|
|
const MCExpr *AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol(
|
|
const MCSymbol *Sym, unsigned Encoding, MCStreamer &Streamer) const {
|
|
// On Darwin, we can reference dwarf symbols with foo@GOT-., which
|
|
// is an indirect pc-relative reference. The default implementation
|
|
// won't reference using the GOT, so we need this target-specific
|
|
// version.
|
|
MCContext &Context = Streamer.getContext();
|
|
const MCExpr *Res =
|
|
MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOT, Context);
|
|
MCSymbol *PCSym = Context.createTempSymbol();
|
|
Streamer.emitLabel(PCSym);
|
|
const MCExpr *PC = MCSymbolRefExpr::create(PCSym, Context);
|
|
return MCBinaryExpr::createSub(Res, PC, Context);
|
|
}
|
|
|
|
AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) {
|
|
if (T.getArch() == Triple::aarch64_be)
|
|
IsLittleEndian = false;
|
|
|
|
// We prefer NEON instructions to be printed in the generic form when
|
|
// targeting ELF.
|
|
AssemblerDialect = AsmWriterVariant == Default ? Generic : AsmWriterVariant;
|
|
|
|
CodePointerSize = T.getEnvironment() == Triple::GNUILP32 ? 4 : 8;
|
|
|
|
// ".comm align is in bytes but .align is pow-2."
|
|
AlignmentIsInBytes = false;
|
|
|
|
CommentString = "//";
|
|
PrivateGlobalPrefix = ".L";
|
|
PrivateLabelPrefix = ".L";
|
|
Code32Directive = ".code\t32";
|
|
|
|
Data16bitsDirective = "\t.hword\t";
|
|
Data32bitsDirective = "\t.word\t";
|
|
Data64bitsDirective = "\t.xword\t";
|
|
|
|
UseDataRegionDirectives = false;
|
|
|
|
WeakRefDirective = "\t.weak\t";
|
|
|
|
SupportsDebugInformation = true;
|
|
|
|
// Exceptions handling
|
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
|
|
|
HasIdentDirective = true;
|
|
}
|
|
|
|
AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() {
|
|
PrivateGlobalPrefix = ".L";
|
|
PrivateLabelPrefix = ".L";
|
|
|
|
Data16bitsDirective = "\t.hword\t";
|
|
Data32bitsDirective = "\t.word\t";
|
|
Data64bitsDirective = "\t.xword\t";
|
|
|
|
AlignmentIsInBytes = false;
|
|
SupportsDebugInformation = true;
|
|
CodePointerSize = 8;
|
|
|
|
CommentString = "//";
|
|
ExceptionsType = ExceptionHandling::WinEH;
|
|
WinEHEncodingType = WinEH::EncodingType::Itanium;
|
|
}
|
|
|
|
AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() {
|
|
PrivateGlobalPrefix = ".L";
|
|
PrivateLabelPrefix = ".L";
|
|
|
|
Data16bitsDirective = "\t.hword\t";
|
|
Data32bitsDirective = "\t.word\t";
|
|
Data64bitsDirective = "\t.xword\t";
|
|
|
|
AlignmentIsInBytes = false;
|
|
SupportsDebugInformation = true;
|
|
CodePointerSize = 8;
|
|
|
|
CommentString = "//";
|
|
ExceptionsType = ExceptionHandling::WinEH;
|
|
WinEHEncodingType = WinEH::EncodingType::Itanium;
|
|
}
|