Today, we always take into account the possibility that object files produced by MC may be consumed by an incremental linker. This results in us initialing fields which vary with time (TimeDateStamp) which harms hermetic builds (e.g. verifying a self-host went well) and produces sub-optimal code because we cannot assume anything about the relative position of functions within a section (call sites can get redirected through incremental linker thunks). Let's provide an MCTargetOption which controls this behavior so that we can disable this functionality if we know a-priori that the build will not rely on /incremental. llvm-svn: 256203
48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
//===-- ARMWinCOFFStreamer.cpp - ARM Target WinCOFF Streamer ----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ARMMCTargetDesc.h"
|
|
#include "llvm/MC/MCWinCOFFStreamer.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
class ARMWinCOFFStreamer : public MCWinCOFFStreamer {
|
|
public:
|
|
ARMWinCOFFStreamer(MCContext &C, MCAsmBackend &AB, MCCodeEmitter &CE,
|
|
raw_pwrite_stream &OS)
|
|
: MCWinCOFFStreamer(C, AB, CE, OS) {}
|
|
|
|
void EmitAssemblerFlag(MCAssemblerFlag Flag) override;
|
|
void EmitThumbFunc(MCSymbol *Symbol) override;
|
|
};
|
|
|
|
void ARMWinCOFFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
|
switch (Flag) {
|
|
default: llvm_unreachable("not implemented");
|
|
case MCAF_SyntaxUnified:
|
|
case MCAF_Code16:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ARMWinCOFFStreamer::EmitThumbFunc(MCSymbol *Symbol) {
|
|
getAssembler().setIsThumbFunc(Symbol);
|
|
}
|
|
}
|
|
|
|
MCStreamer *llvm::createARMWinCOFFStreamer(
|
|
MCContext &Context, MCAsmBackend &MAB, raw_pwrite_stream &OS,
|
|
MCCodeEmitter *Emitter, bool RelaxAll, bool IncrementalLinkerCompatible) {
|
|
auto *S = new ARMWinCOFFStreamer(Context, MAB, *Emitter, OS);
|
|
S->getAssembler().setIncrementalLinkerCompatible(IncrementalLinkerCompatible);
|
|
return S;
|
|
}
|
|
|