mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-25 03:30:37 +00:00
subsequent changes are easier to review. About to fix some layering issues, and wanted to separate out the necessary churn. Also comment and sink the include of "Windows.h" in three .inc files to match the usage in Memory.inc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198685 91177308-0d34-0410-b5e6-96231b3b80d8
88 lines
2.7 KiB
C++
88 lines
2.7 KiB
C++
//===-- MipsTargetStreamer.cpp - Mips Target Streamer Methods -------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file provides Mips specific target streamer methods.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "MipsTargetStreamer.h"
|
|
#include "llvm/MC/MCELF.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/ELF.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/FormattedStream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static cl::opt<bool> PrintHackDirectives("print-hack-directives",
|
|
cl::init(false), cl::Hidden);
|
|
|
|
// Pin vtable to this file.
|
|
void MipsTargetStreamer::anchor() {}
|
|
|
|
MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS)
|
|
: OS(OS) {}
|
|
|
|
void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) {
|
|
if (!PrintHackDirectives)
|
|
return;
|
|
|
|
OS << "\t.mips_hack_elf_flags 0x";
|
|
OS.write_hex(Flags);
|
|
OS << '\n';
|
|
}
|
|
void MipsTargetAsmStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) {
|
|
if (!PrintHackDirectives)
|
|
return;
|
|
|
|
OS << "\t.mips_hack_stocg ";
|
|
OS << Sym->getName();
|
|
OS << ", ";
|
|
OS << Val;
|
|
OS << '\n';
|
|
}
|
|
void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
|
|
void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
|
|
OS << "\t.option\tpic0\n";
|
|
}
|
|
|
|
// This part is for ELF object output.
|
|
MipsTargetELFStreamer::MipsTargetELFStreamer() {}
|
|
|
|
MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
|
|
return static_cast<MCELFStreamer &>(*Streamer);
|
|
}
|
|
|
|
void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {
|
|
MCAssembler &MCA = getStreamer().getAssembler();
|
|
MCA.setELFHeaderEFlags(Flags);
|
|
}
|
|
|
|
// Set a symbol's STO flags.
|
|
void MipsTargetELFStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) {
|
|
MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Sym);
|
|
// The "other" values are stored in the last 6 bits of the second byte
|
|
// The traditional defines for STO values assume the full byte and thus
|
|
// the shift to pack it.
|
|
MCELF::setOther(Data, Val >> 2);
|
|
}
|
|
void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
|
|
MCAssembler &MCA = getStreamer().getAssembler();
|
|
unsigned Flags = MCA.getELFHeaderEFlags();
|
|
Flags |= ELF::EF_MIPS_CPIC;
|
|
MCA.setELFHeaderEFlags(Flags);
|
|
}
|
|
void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
|
|
MCAssembler &MCA = getStreamer().getAssembler();
|
|
unsigned Flags = MCA.getELFHeaderEFlags();
|
|
Flags &= ~ELF::EF_MIPS_PIC;
|
|
MCA.setELFHeaderEFlags(Flags);
|
|
}
|