mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 03:53:04 +02:00
cf7a7cf40d
It turns out we decide whether to use SjLj exceptions or some alternative in two separate places in the backend, and they disagreed with each other. This led to inconsistent code and is generally a terrible idea. So make them consistent and add an assert that they *do* match (unfortunately MCAsmInfo isn't available in opt, so it can't be used to initialise the CodeGen version directly). llvm-svn: 253502
116 lines
3.0 KiB
C++
116 lines
3.0 KiB
C++
//===-- ARMMCAsmInfo.cpp - ARM asm properties -----------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the declarations of the ARMMCAsmInfo properties.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ARMMCAsmInfo.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
|
|
using namespace llvm;
|
|
|
|
void ARMMCAsmInfoDarwin::anchor() { }
|
|
|
|
ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) {
|
|
if ((TheTriple.getArch() == Triple::armeb) ||
|
|
(TheTriple.getArch() == Triple::thumbeb))
|
|
IsLittleEndian = false;
|
|
|
|
Data64bitsDirective = nullptr;
|
|
CommentString = "@";
|
|
Code16Directive = ".code\t16";
|
|
Code32Directive = ".code\t32";
|
|
UseDataRegionDirectives = true;
|
|
|
|
SupportsDebugInformation = true;
|
|
|
|
// Exceptions handling
|
|
ExceptionsType = TheTriple.isOSDarwin() && !TheTriple.isWatchOS()
|
|
? ExceptionHandling::SjLj
|
|
: ExceptionHandling::DwarfCFI;
|
|
|
|
UseIntegratedAssembler = true;
|
|
}
|
|
|
|
void ARMELFMCAsmInfo::anchor() { }
|
|
|
|
ARMELFMCAsmInfo::ARMELFMCAsmInfo(const Triple &TheTriple) {
|
|
if ((TheTriple.getArch() == Triple::armeb) ||
|
|
(TheTriple.getArch() == Triple::thumbeb))
|
|
IsLittleEndian = false;
|
|
|
|
// ".comm align is in bytes but .align is pow-2."
|
|
AlignmentIsInBytes = false;
|
|
|
|
Data64bitsDirective = nullptr;
|
|
CommentString = "@";
|
|
Code16Directive = ".code\t16";
|
|
Code32Directive = ".code\t32";
|
|
|
|
SupportsDebugInformation = true;
|
|
|
|
// Exceptions handling
|
|
switch (TheTriple.getOS()) {
|
|
case Triple::Bitrig:
|
|
case Triple::NetBSD:
|
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
|
break;
|
|
default:
|
|
ExceptionsType = ExceptionHandling::ARM;
|
|
break;
|
|
}
|
|
|
|
// foo(plt) instead of foo@plt
|
|
UseParensForSymbolVariant = true;
|
|
|
|
UseIntegratedAssembler = true;
|
|
}
|
|
|
|
void ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) {
|
|
UseIntegratedAssembler = Value;
|
|
if (!UseIntegratedAssembler) {
|
|
// gas doesn't handle VFP register names in cfi directives,
|
|
// so don't use register names with external assembler.
|
|
// See https://sourceware.org/bugzilla/show_bug.cgi?id=16694
|
|
DwarfRegNumForCFI = true;
|
|
}
|
|
}
|
|
|
|
void ARMCOFFMCAsmInfoMicrosoft::anchor() { }
|
|
|
|
ARMCOFFMCAsmInfoMicrosoft::ARMCOFFMCAsmInfoMicrosoft() {
|
|
AlignmentIsInBytes = false;
|
|
|
|
PrivateGlobalPrefix = "$M";
|
|
PrivateLabelPrefix = "$M";
|
|
}
|
|
|
|
void ARMCOFFMCAsmInfoGNU::anchor() { }
|
|
|
|
ARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() {
|
|
AlignmentIsInBytes = false;
|
|
HasSingleParameterDotFile = true;
|
|
|
|
CommentString = "@";
|
|
Code16Directive = ".code\t16";
|
|
Code32Directive = ".code\t32";
|
|
PrivateGlobalPrefix = ".L";
|
|
PrivateLabelPrefix = ".L";
|
|
|
|
SupportsDebugInformation = true;
|
|
ExceptionsType = ExceptionHandling::None;
|
|
UseParensForSymbolVariant = true;
|
|
|
|
UseIntegratedAssembler = false;
|
|
DwarfRegNumForCFI = true;
|
|
}
|
|
|