LLVM: lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
21
22using namespace llvm;
23
24
25
26
27
30
32
33
34
36 return ConstantPools->addEntry(Streamer, Expr, 4, Loc);
37}
38
40 ConstantPools->emitForCurrentSection(Streamer);
41 ConstantPools->clearCacheForCurrentSection(Streamer);
42}
43
44
46 ConstantPools->emitAll(Streamer);
47}
48
49
51
53 unsigned Size;
54 char Buffer[4];
56
57 switch (Suffix) {
58 case '\0':
60
61 for (unsigned II = 0, IE = Size; II != IE; II++) {
62 const unsigned I = LittleEndian ? (Size - II - 1) : II;
63 Buffer[Size - II - 1] = uint8_t(Inst >> I * CHAR_BIT);
64 }
65
66 break;
67 case 'n':
68 case 'w':
69 Size = (Suffix == 'n' ? 2 : 4);
70
71
72
73 for (unsigned II = 0, IE = Size; II != IE; II = II + 2) {
74 const unsigned I0 = LittleEndian ? II + 0 : II + 1;
75 const unsigned I1 = LittleEndian ? II + 1 : II + 0;
76 Buffer[Size - II - 2] = uint8_t(Inst >> I0 * CHAR_BIT);
77 Buffer[Size - II - 1] = uint8_t(Inst >> I1 * CHAR_BIT);
78 }
79
80 break;
81 default:
83 }
85}
86
87
88
123
134
170
172
173 return (STI.hasFeature(ARM::HasV8MBaselineOps) &&
175 STI.hasFeature(ARM::HasV8MMainlineOps);
176}
177
178
179
182
184 if (!CPUString.empty() && !CPUString.starts_with("generic")) {
185
186 if (STI.hasFeature(ARM::ProcKrait)) {
188
189
190 if (STI.hasFeature(ARM::FeatureHWDivThumb) ||
191 STI.hasFeature(ARM::FeatureHWDivARM))
193 } else {
195 }
196 }
197
199
200 if (STI.hasFeature(ARM::FeatureAClass)) {
203 } else if (STI.hasFeature(ARM::FeatureRClass)) {
206 } else if (STI.hasFeature(ARM::FeatureMClass)) {
209 }
210
214
215 if (isV8M(STI)) {
218 } else if (STI.hasFeature(ARM::FeatureThumb2)) {
221 } else if (STI.hasFeature(ARM::HasV4TOps)) {
223 }
224
225 if (STI.hasFeature(ARM::FeatureNEON)) {
226
227
228 if (STI.hasFeature(ARM::FeatureFPARMv8)) {
229 if (STI.hasFeature(ARM::FeatureCrypto))
230 emitFPU(ARM::FK_CRYPTO_NEON_FP_ARMV8);
231 else
232 emitFPU(ARM::FK_NEON_FP_ARMV8);
233 } else if (STI.hasFeature(ARM::FeatureVFP4))
234 emitFPU(ARM::FK_NEON_VFPV4);
235 else
237 : ARM::FK_NEON);
238
244 } else {
245 if (STI.hasFeature(ARM::FeatureFPARMv8_D16_SP)) {
246
247
249 emitFPU(ARM::FK_FP_ARMV8);
250 else {
252 : ARM::FK_FPV5_SP_D16);
253 if (STI.hasFeature(ARM::HasMVEFloatOps))
255 }
256 } else if (STI.hasFeature(ARM::FeatureVFP4_D16_SP))
258 ? ARM::FK_VFPV4
259 : (STI.hasFeature(ARM::FeatureFP64) ? ARM::FK_VFPV4_D16
260 : ARM::FK_FPV4_SP_D16));
261 else if (STI.hasFeature(ARM::FeatureVFP3_D16_SP))
264
265 ? (STI.hasFeature(ARM::FeatureFP16) ? ARM::FK_VFPV3_FP16
266 : ARM::FK_VFPV3)
267
270 ? ARM::FK_VFPV3_D16_FP16
271 : ARM::FK_VFPV3_D16)
272 : (STI.hasFeature(ARM::FeatureFP16) ? ARM::FK_VFPV3XD_FP16
273 : ARM::FK_VFPV3XD)));
274 else if (STI.hasFeature(ARM::FeatureVFP2_SP))
276 }
277
278
279 if (STI.hasFeature(ARM::FeatureVFP2_SP) && !STI.hasFeature(ARM::FeatureFP64))
282
283 if (STI.hasFeature(ARM::FeatureFP16))
285
288
289 if (STI.hasFeature(ARM::HasMVEFloatOps))
291 else if (STI.hasFeature(ARM::HasMVEIntegerOps))
293
294
295
296
297
298
299
302
305
306 if (STI.hasFeature(ARM::FeatureStrictAlign))
309 else
312
313 if (STI.hasFeature(ARM::FeatureTrustZone) &&
314 STI.hasFeature(ARM::FeatureVirtualization))
317 else if (STI.hasFeature(ARM::FeatureTrustZone))
319 else if (STI.hasFeature(ARM::FeatureVirtualization))
322
323 if (STI.hasFeature(ARM::FeaturePACBTI)) {
326 }
327}
328
332 if (TT.isOSBinFormatELF())
334 if (TT.isOSBinFormatCOFF())
336 if (TT.isOSBinFormatMachO())
339}
static bool isV8M(const MCSubtargetInfo &STI)
Definition ARMTargetStreamer.cpp:171
static ARMBuildAttrs::CPUArch getArchForCPU(const MCSubtargetInfo &STI)
Definition ARMTargetStreamer.cpp:135
uint64_t IntrinsicInst * II
virtual void emitUnwindRaw(int64_t StackOffset, const SmallVectorImpl< uint8_t > &Opcodes)
Definition ARMTargetStreamer.cpp:101
~ARMTargetStreamer() override
void emitTargetAttributes(const MCSubtargetInfo &STI)
Emit the build attributes that only depend on the hardware that we expect.
Definition ARMTargetStreamer.cpp:180
virtual void reset()
Reset any state between object emissions, i.e.
Definition ARMTargetStreamer.cpp:50
virtual void emitSetFP(MCRegister FpReg, MCRegister SpReg, int64_t Offset=0)
Definition ARMTargetStreamer.cpp:95
virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE)
Definition ARMTargetStreamer.cpp:116
virtual void finishAttributeSection()
Definition ARMTargetStreamer.cpp:115
virtual void emitFnEnd()
Definition ARMTargetStreamer.cpp:90
ARMTargetStreamer(MCStreamer &S)
Definition ARMTargetStreamer.cpp:28
virtual void emitMovSP(MCRegister Reg, int64_t Offset=0)
Definition ARMTargetStreamer.cpp:97
virtual void emitARMWinCFISaveSP(unsigned Reg)
Definition ARMTargetStreamer.cpp:126
virtual void emitPersonalityIndex(unsigned Index)
Definition ARMTargetStreamer.cpp:93
virtual void emitInst(uint32_t Inst, char Suffix='\0')
Definition ARMTargetStreamer.cpp:52
virtual void emitARMWinCFISaveLR(unsigned Offset)
Definition ARMTargetStreamer.cpp:128
virtual void emitArchExtension(uint64_t ArchExt)
Definition ARMTargetStreamer.cpp:112
virtual void emitTextAttribute(unsigned Attribute, StringRef String)
Definition ARMTargetStreamer.cpp:106
virtual void emitARMWinCFIAllocStack(unsigned Size, bool Wide)
Definition ARMTargetStreamer.cpp:124
virtual void emitARMWinCFICustom(unsigned Opcode)
Definition ARMTargetStreamer.cpp:133
virtual void emitARMWinCFISaveRegMask(unsigned Mask, bool Wide)
Definition ARMTargetStreamer.cpp:125
virtual void emitRegSave(const SmallVectorImpl< MCRegister > &RegList, bool isVector)
Definition ARMTargetStreamer.cpp:99
virtual void emitARMWinCFIEpilogEnd()
Definition ARMTargetStreamer.cpp:132
virtual void emitARMWinCFIPrologEnd(bool Fragment)
Definition ARMTargetStreamer.cpp:130
virtual void switchVendor(StringRef Vendor)
Definition ARMTargetStreamer.cpp:104
virtual void emitCode16()
Definition ARMTargetStreamer.cpp:119
virtual void emitFnStart()
Definition ARMTargetStreamer.cpp:89
virtual void emitPersonality(const MCSymbol *Personality)
Definition ARMTargetStreamer.cpp:92
virtual void emitObjectArch(ARM::ArchKind Arch)
Definition ARMTargetStreamer.cpp:113
const MCExpr * addConstantPoolEntry(const MCExpr *, SMLoc Loc)
Callback used to implement the ldr= pseudo.
Definition ARMTargetStreamer.cpp:35
virtual void emitHandlerData()
Definition ARMTargetStreamer.cpp:94
virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, StringRef StringValue="")
Definition ARMTargetStreamer.cpp:108
virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value)
Definition ARMTargetStreamer.cpp:122
virtual void emitThumbFunc(MCSymbol *Symbol)
Definition ARMTargetStreamer.cpp:121
virtual void emitFPU(ARM::FPUKind FPU)
Definition ARMTargetStreamer.cpp:114
virtual void emitCantUnwind()
Definition ARMTargetStreamer.cpp:91
virtual void emitARMWinCFISaveFRegs(unsigned First, unsigned Last)
Definition ARMTargetStreamer.cpp:127
virtual void emitCode32()
Definition ARMTargetStreamer.cpp:120
virtual void emitSyntaxUnified()
Definition ARMTargetStreamer.cpp:118
virtual void emitARMWinCFIEpilogStart(unsigned Condition)
Definition ARMTargetStreamer.cpp:131
virtual void emitPad(int64_t Offset)
Definition ARMTargetStreamer.cpp:98
void emitCurrentConstantPool()
Callback used to implement the .ltorg directive.
Definition ARMTargetStreamer.cpp:39
virtual void emitAttribute(unsigned Attribute, unsigned Value)
Definition ARMTargetStreamer.cpp:105
virtual void emitARMWinCFINop(bool Wide)
Definition ARMTargetStreamer.cpp:129
void emitConstantPools() override
Definition ARMTargetStreamer.cpp:45
virtual void emitArch(ARM::ArchKind Arch)
Definition ARMTargetStreamer.cpp:111
Functions, function parameters, and return types can have attributes to indicate how they should be t...
bool isLittleEndian() const
True if the target is little endian.
const MCAsmInfo * getAsmInfo() const
Base class for the full range of assembler expressions which are needed for parsing.
Wrapper class representing physical registers. Should be passed by value.
Streaming machine code generation interface.
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
Represent a reference to a symbol from inside an expression.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Target specific streamer interface.
MCStreamer & getStreamer()
MCTargetStreamer(MCStreamer &S)
Represents a location in source code.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StackOffset holds a fixed and a scalable offset in bytes.
StringRef - Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
Triple - Helper class for working with autoconf configuration names.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ AllowMVEIntegerAndFloat
This is an optimization pass for GlobalISel generic memory operations.
MCTargetStreamer * createARMObjectTargetMachOStreamer(MCStreamer &S)
MCTargetStreamer * createARMObjectTargetELFStreamer(MCStreamer &S)
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
MCTargetStreamer * createARMObjectTargetWinCOFFStreamer(MCStreamer &S)
MCTargetStreamer * createARMObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
Definition ARMTargetStreamer.cpp:330