Add a triple for powerpcle-*-*. This is a little-endian encoding of the 32-bit PowerPC ABI, useful in certain niche situations: 1) A loader such as the FreeBSD loader which will be loading a little endian kernel. This is required for PowerPC64LE to load properly in pseries VMs. Such a loader is implemented as a freestanding ELF32 LSB binary. 2) Userspace emulation of a 32-bit LE architecture such as x86 on 64-bit hosts such as PowerPC64LE with tools like box86 requires having a 32-bit LE toolchain and library set, as they operate by translating only the main binary and switching to native code when making library calls. 3) The Void Linux for PowerPC project is experimenting with running an entire powerpcle userland. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D93918
67 lines
2.0 KiB
C++
67 lines
2.0 KiB
C++
//===-- PPCMCAsmInfo.cpp - PPC 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 MCAsmInfoDarwin properties.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "PPCMCAsmInfo.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include <cassert>
|
|
|
|
using namespace llvm;
|
|
|
|
void PPCELFMCAsmInfo::anchor() { }
|
|
|
|
PPCELFMCAsmInfo::PPCELFMCAsmInfo(bool is64Bit, const Triple& T) {
|
|
// FIXME: This is not always needed. For example, it is not needed in the
|
|
// v2 abi.
|
|
NeedsLocalForSize = true;
|
|
|
|
if (is64Bit) {
|
|
CodePointerSize = CalleeSaveStackSlotSize = 8;
|
|
}
|
|
IsLittleEndian =
|
|
T.getArch() == Triple::ppc64le || T.getArch() == Triple::ppcle;
|
|
|
|
// ".comm align is in bytes but .align is pow-2."
|
|
AlignmentIsInBytes = false;
|
|
|
|
CommentString = "#";
|
|
|
|
// Uses '.section' before '.bss' directive
|
|
UsesELFSectionDirectiveForBSS = true;
|
|
|
|
// Debug Information
|
|
SupportsDebugInformation = true;
|
|
|
|
DollarIsPC = true;
|
|
|
|
// Set up DWARF directives
|
|
MinInstAlignment = 4;
|
|
|
|
// Exceptions handling
|
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
|
|
|
ZeroDirective = "\t.space\t";
|
|
Data64bitsDirective = is64Bit ? "\t.quad\t" : nullptr;
|
|
AssemblerDialect = 1; // New-Style mnemonics.
|
|
LCOMMDirectiveAlignmentType = LCOMM::ByteAlignment;
|
|
}
|
|
|
|
void PPCXCOFFMCAsmInfo::anchor() {}
|
|
|
|
PPCXCOFFMCAsmInfo::PPCXCOFFMCAsmInfo(bool Is64Bit, const Triple &T) {
|
|
if (T.getArch() == Triple::ppc64le || T.getArch() == Triple::ppcle)
|
|
report_fatal_error("XCOFF is not supported for little-endian targets");
|
|
CodePointerSize = CalleeSaveStackSlotSize = Is64Bit ? 8 : 4;
|
|
|
|
// A size of 8 is only supported by the assembler under 64-bit.
|
|
Data64bitsDirective = Is64Bit ? "\t.vbyte\t8, " : nullptr;
|
|
}
|