Line data Source code
1 : //===- AsmPrinter.cpp - Common AsmPrinter code ----------------------------===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This file implements the AsmPrinter class.
11 : //
12 : //===----------------------------------------------------------------------===//
13 :
14 : #include "llvm/CodeGen/AsmPrinter.h"
15 : #include "AsmPrinterHandler.h"
16 : #include "CodeViewDebug.h"
17 : #include "DwarfDebug.h"
18 : #include "DwarfException.h"
19 : #include "WinCFGuard.h"
20 : #include "WinException.h"
21 : #include "llvm/ADT/APFloat.h"
22 : #include "llvm/ADT/APInt.h"
23 : #include "llvm/ADT/DenseMap.h"
24 : #include "llvm/ADT/STLExtras.h"
25 : #include "llvm/ADT/SmallPtrSet.h"
26 : #include "llvm/ADT/SmallString.h"
27 : #include "llvm/ADT/SmallVector.h"
28 : #include "llvm/ADT/Statistic.h"
29 : #include "llvm/ADT/StringRef.h"
30 : #include "llvm/ADT/Triple.h"
31 : #include "llvm/ADT/Twine.h"
32 : #include "llvm/Analysis/ConstantFolding.h"
33 : #include "llvm/Analysis/EHPersonalities.h"
34 : #include "llvm/Analysis/OptimizationRemarkEmitter.h"
35 : #include "llvm/BinaryFormat/COFF.h"
36 : #include "llvm/BinaryFormat/Dwarf.h"
37 : #include "llvm/BinaryFormat/ELF.h"
38 : #include "llvm/CodeGen/GCMetadata.h"
39 : #include "llvm/CodeGen/GCMetadataPrinter.h"
40 : #include "llvm/CodeGen/GCStrategy.h"
41 : #include "llvm/CodeGen/MachineBasicBlock.h"
42 : #include "llvm/CodeGen/MachineConstantPool.h"
43 : #include "llvm/CodeGen/MachineDominators.h"
44 : #include "llvm/CodeGen/MachineFrameInfo.h"
45 : #include "llvm/CodeGen/MachineFunction.h"
46 : #include "llvm/CodeGen/MachineFunctionPass.h"
47 : #include "llvm/CodeGen/MachineInstr.h"
48 : #include "llvm/CodeGen/MachineInstrBundle.h"
49 : #include "llvm/CodeGen/MachineJumpTableInfo.h"
50 : #include "llvm/CodeGen/MachineLoopInfo.h"
51 : #include "llvm/CodeGen/MachineMemOperand.h"
52 : #include "llvm/CodeGen/MachineModuleInfo.h"
53 : #include "llvm/CodeGen/MachineModuleInfoImpls.h"
54 : #include "llvm/CodeGen/MachineOperand.h"
55 : #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
56 : #include "llvm/CodeGen/TargetFrameLowering.h"
57 : #include "llvm/CodeGen/TargetInstrInfo.h"
58 : #include "llvm/CodeGen/TargetLowering.h"
59 : #include "llvm/CodeGen/TargetOpcodes.h"
60 : #include "llvm/CodeGen/TargetRegisterInfo.h"
61 : #include "llvm/CodeGen/TargetSubtargetInfo.h"
62 : #include "llvm/IR/BasicBlock.h"
63 : #include "llvm/IR/Comdat.h"
64 : #include "llvm/IR/Constant.h"
65 : #include "llvm/IR/Constants.h"
66 : #include "llvm/IR/DataLayout.h"
67 : #include "llvm/IR/DebugInfoMetadata.h"
68 : #include "llvm/IR/DerivedTypes.h"
69 : #include "llvm/IR/Function.h"
70 : #include "llvm/IR/GlobalAlias.h"
71 : #include "llvm/IR/GlobalIFunc.h"
72 : #include "llvm/IR/GlobalIndirectSymbol.h"
73 : #include "llvm/IR/GlobalObject.h"
74 : #include "llvm/IR/GlobalValue.h"
75 : #include "llvm/IR/GlobalVariable.h"
76 : #include "llvm/IR/Instruction.h"
77 : #include "llvm/IR/Mangler.h"
78 : #include "llvm/IR/Metadata.h"
79 : #include "llvm/IR/Module.h"
80 : #include "llvm/IR/Operator.h"
81 : #include "llvm/IR/Type.h"
82 : #include "llvm/IR/Value.h"
83 : #include "llvm/MC/MCAsmInfo.h"
84 : #include "llvm/MC/MCCodePadder.h"
85 : #include "llvm/MC/MCContext.h"
86 : #include "llvm/MC/MCDirectives.h"
87 : #include "llvm/MC/MCDwarf.h"
88 : #include "llvm/MC/MCExpr.h"
89 : #include "llvm/MC/MCInst.h"
90 : #include "llvm/MC/MCSection.h"
91 : #include "llvm/MC/MCSectionCOFF.h"
92 : #include "llvm/MC/MCSectionELF.h"
93 : #include "llvm/MC/MCSectionMachO.h"
94 : #include "llvm/MC/MCStreamer.h"
95 : #include "llvm/MC/MCSubtargetInfo.h"
96 : #include "llvm/MC/MCSymbol.h"
97 : #include "llvm/MC/MCSymbolELF.h"
98 : #include "llvm/MC/MCTargetOptions.h"
99 : #include "llvm/MC/MCValue.h"
100 : #include "llvm/MC/SectionKind.h"
101 : #include "llvm/Pass.h"
102 : #include "llvm/Support/Casting.h"
103 : #include "llvm/Support/CommandLine.h"
104 : #include "llvm/Support/Compiler.h"
105 : #include "llvm/Support/ErrorHandling.h"
106 : #include "llvm/Support/Format.h"
107 : #include "llvm/Support/MathExtras.h"
108 : #include "llvm/Support/Path.h"
109 : #include "llvm/Support/TargetRegistry.h"
110 : #include "llvm/Support/Timer.h"
111 : #include "llvm/Support/raw_ostream.h"
112 : #include "llvm/Target/TargetLoweringObjectFile.h"
113 : #include "llvm/Target/TargetMachine.h"
114 : #include "llvm/Target/TargetOptions.h"
115 : #include <algorithm>
116 : #include <cassert>
117 : #include <cinttypes>
118 : #include <cstdint>
119 : #include <iterator>
120 : #include <limits>
121 : #include <memory>
122 : #include <string>
123 : #include <utility>
124 : #include <vector>
125 :
126 : using namespace llvm;
127 :
128 : #define DEBUG_TYPE "asm-printer"
129 :
130 : static const char *const DWARFGroupName = "dwarf";
131 : static const char *const DWARFGroupDescription = "DWARF Emission";
132 : static const char *const DbgTimerName = "emit";
133 : static const char *const DbgTimerDescription = "Debug Info Emission";
134 : static const char *const EHTimerName = "write_exception";
135 : static const char *const EHTimerDescription = "DWARF Exception Writer";
136 : static const char *const CFGuardName = "Control Flow Guard";
137 : static const char *const CFGuardDescription = "Control Flow Guard Tables";
138 : static const char *const CodeViewLineTablesGroupName = "linetables";
139 : static const char *const CodeViewLineTablesGroupDescription =
140 : "CodeView Line Tables";
141 :
142 : STATISTIC(EmittedInsts, "Number of machine instrs printed");
143 :
144 : static cl::opt<bool>
145 : PrintSchedule("print-schedule", cl::Hidden, cl::init(false),
146 : cl::desc("Print 'sched: [latency:throughput]' in .s output"));
147 :
148 : char AsmPrinter::ID = 0;
149 :
150 : using gcp_map_type = DenseMap<GCStrategy *, std::unique_ptr<GCMetadataPrinter>>;
151 :
152 18 : static gcp_map_type &getGCMap(void *&P) {
153 18 : if (!P)
154 12 : P = new gcp_map_type();
155 18 : return *(gcp_map_type*)P;
156 : }
157 :
158 : /// getGVAlignmentLog2 - Return the alignment to use for the specified global
159 : /// value in log2 form. This rounds up to the preferred alignment if possible
160 : /// and legal.
161 944886 : static unsigned getGVAlignmentLog2(const GlobalValue *GV, const DataLayout &DL,
162 : unsigned InBits = 0) {
163 : unsigned NumBits = 0;
164 : if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
165 540412 : NumBits = DL.getPreferredAlignmentLog(GVar);
166 :
167 : // If InBits is specified, round it to it.
168 944886 : if (InBits > NumBits)
169 : NumBits = InBits;
170 :
171 : // If the GV has a specified alignment, take it into account.
172 944886 : if (GV->getAlignment() == 0)
173 : return NumBits;
174 :
175 661430 : unsigned GVAlign = Log2_32(GV->getAlignment());
176 :
177 : // If the GVAlign is larger than NumBits, or if we are required to obey
178 : // NumBits because the GV has an assigned section, obey it.
179 1322856 : if (GVAlign > NumBits || GV->hasSection())
180 : NumBits = GVAlign;
181 : return NumBits;
182 : }
183 :
184 27413 : AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer)
185 : : MachineFunctionPass(ID), TM(tm), MAI(tm.getMCAsmInfo()),
186 27413 : OutContext(Streamer->getContext()), OutStreamer(std::move(Streamer)) {
187 27413 : VerboseAsm = OutStreamer->isVerboseAsm();
188 27413 : }
189 :
190 81807 : AsmPrinter::~AsmPrinter() {
191 : assert(!DD && Handlers.empty() && "Debug/EH info didn't get finalized");
192 :
193 27269 : if (GCMetadataPrinters) {
194 6 : gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
195 :
196 12 : delete &GCMap;
197 6 : GCMetadataPrinters = nullptr;
198 : }
199 27269 : }
200 0 :
201 : bool AsmPrinter::isPositionIndependent() const {
202 : return TM.isPositionIndependent();
203 : }
204 :
205 : /// getFunctionNumber - Return a unique ID for the current function.
206 : unsigned AsmPrinter::getFunctionNumber() const {
207 : return MF->getFunctionNumber();
208 : }
209 0 :
210 81807 : const TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
211 : return *TM.getObjFileLowering();
212 : }
213 27269 :
214 6 : const DataLayout &AsmPrinter::getDataLayout() const {
215 : return MMI->getModule()->getDataLayout();
216 12 : }
217 6 :
218 : // Do not use the cached DataLayout because some client use it without a Module
219 27269 : // (dsymutil, llvm-dwarfdump).
220 : unsigned AsmPrinter::getPointerSize() const {
221 9095 : return TM.getPointerSize(0); // FIXME: Default address space
222 9095 : }
223 :
224 : const MCSubtargetInfo &AsmPrinter::getSubtargetInfo() const {
225 : assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
226 143392 : return MF->getSubtarget<MCSubtargetInfo>();
227 143392 : }
228 :
229 : void AsmPrinter::EmitToStreamer(MCStreamer &S, const MCInst &Inst) {
230 5147578 : S.EmitInstruction(Inst, getSubtargetInfo());
231 5147578 : }
232 :
233 : /// getCurrentSection() - Return the current section we are emitting to.
234 777858 : const MCSection *AsmPrinter::getCurrentSection() const {
235 777858 : return OutStreamer->getCurrentSectionOnly();
236 : }
237 :
238 : void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
239 : AU.setPreservesAll();
240 1302069 : MachineFunctionPass::getAnalysisUsage(AU);
241 1302069 : AU.addRequired<MachineModuleInfo>();
242 : AU.addRequired<MachineOptimizationRemarkEmitterPass>();
243 : AU.addRequired<GCModuleInfo>();
244 67848705 : }
245 :
246 67848705 : bool AsmPrinter::doInitialization(Module &M) {
247 : MMI = getAnalysisIfAvailable<MachineModuleInfo>();
248 :
249 963499 : // Initialize TargetLoweringObjectFile.
250 963499 : const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
251 963499 : .Initialize(OutContext, TM);
252 :
253 : OutStreamer->InitSections(false);
254 620929 :
255 620929 : // Emit the version-min deployment target directive if needed.
256 : //
257 : // FIXME: If we end up with a collection of these sorts of Darwin-specific
258 27257 : // or ELF-specific things, it may make sense to have a platform helper class
259 : // that will work with the target helper class. For now keep it here, as the
260 27257 : // alternative is duplicated code in each of the target asm printers that
261 : // use the directive, where it would need the same conditionalization
262 : // anyway.
263 : const Triple &Target = TM.getTargetTriple();
264 27257 : OutStreamer->EmitVersionForTarget(Target);
265 :
266 27258 : // Allow the target to emit any magic that it wants at the start of the file.
267 27258 : EmitStartOfAsmFile(M);
268 :
269 : // Very minimal debug info. It is ignored if we emit actual debug info. If we
270 27258 : // don't, this at least helps the user find where a global came from.
271 27258 : if (MAI->hasSingleParameterDotFile()) {
272 : // .file "foo.c"
273 27258 : OutStreamer->EmitFileDirective(
274 : llvm::sys::path::filename(M.getSourceFileName()));
275 : }
276 :
277 : GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
278 : assert(MI && "AsmPrinter didn't require GCModuleInfo?");
279 : for (auto &I : *MI)
280 : if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
281 : MP->beginAssembly(M, *MI, *this);
282 :
283 27258 : // Emit module-level inline asm if it exists.
284 27258 : if (!M.getModuleInlineAsm().empty()) {
285 : // We're at the module level. Construct MCSubtarget from the default CPU
286 : // and target triple.
287 27258 : std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
288 : TM.getTargetTriple().str(), TM.getTargetCPU(),
289 : TM.getTargetFeatureString()));
290 : OutStreamer->AddComment("Start of file scope inline assembly");
291 27258 : OutStreamer->AddBlankLine();
292 : EmitInlineAsm(M.getModuleInlineAsm()+"\n",
293 21582 : OutContext.getSubtargetCopy(*STI), TM.Options.MCOptions);
294 21582 : OutStreamer->AddComment("End of file scope inline assembly");
295 : OutStreamer->AddBlankLine();
296 : }
297 27258 :
298 : if (MAI->doesSupportDebugInformation()) {
299 27283 : bool EmitCodeView = MMI->getModule()->getCodeViewFlag();
300 25 : if (EmitCodeView && TM.getTargetTriple().isOSWindows()) {
301 6 : Handlers.push_back(HandlerInfo(new CodeViewDebug(this),
302 : DbgTimerName, DbgTimerDescription,
303 : CodeViewLineTablesGroupName,
304 27258 : CodeViewLineTablesGroupDescription));
305 : }
306 : if (!EmitCodeView || MMI->getModule()->getDwarfVersion()) {
307 78 : DD = new DwarfDebug(this, &M);
308 : DD->beginModule();
309 78 : Handlers.push_back(HandlerInfo(DD, DbgTimerName, DbgTimerDescription,
310 156 : DWARFGroupName, DWARFGroupDescription));
311 78 : }
312 152 : }
313 78 :
314 156 : switch (MAI->getExceptionHandlingType()) {
315 78 : case ExceptionHandling::SjLj:
316 : case ExceptionHandling::DwarfCFI:
317 : case ExceptionHandling::ARM:
318 27258 : isCFIMoveForDebugging = true;
319 27115 : if (MAI->getExceptionHandlingType() != ExceptionHandling::DwarfCFI)
320 27115 : break;
321 132 : for (auto &F: M.getFunctionList()) {
322 : // If the module contains any function with unwind data,
323 : // .eh_frame has to be emitted.
324 : // Ignore functions that won't get emitted.
325 : if (!F.isDeclarationForLinker() && F.needsUnwindTableEntry()) {
326 27115 : isCFIMoveForDebugging = false;
327 26982 : break;
328 26982 : }
329 53964 : }
330 : break;
331 : default:
332 : isCFIMoveForDebugging = false;
333 : break;
334 27258 : }
335 23684 :
336 : EHStreamer *ES = nullptr;
337 : switch (MAI->getExceptionHandlingType()) {
338 23684 : case ExceptionHandling::None:
339 23684 : break;
340 : case ExceptionHandling::SjLj:
341 71999 : case ExceptionHandling::DwarfCFI:
342 : ES = new DwarfCFIException(this);
343 : break;
344 : case ExceptionHandling::ARM:
345 132890 : ES = new ARMException(this);
346 15465 : break;
347 15465 : case ExceptionHandling::WinEH:
348 : switch (MAI->getWinEHEncodingType()) {
349 : default: llvm_unreachable("unsupported unwinding information encoding");
350 : case WinEH::EncodingType::Invalid:
351 3574 : break;
352 3574 : case WinEH::EncodingType::X86:
353 3574 : case WinEH::EncodingType::Itanium:
354 : ES = new WinException(this);
355 : break;
356 : }
357 27258 : break;
358 : case ExceptionHandling::Wasm:
359 : // TODO to prevent warning
360 21725 : break;
361 : }
362 21725 : if (ES)
363 21725 : Handlers.push_back(HandlerInfo(ES, EHTimerName, EHTimerDescription,
364 1959 : DWARFGroupName, DWARFGroupDescription));
365 1959 :
366 1959 : if (mdconst::extract_or_null<ConstantInt>(
367 653 : MMI->getModule()->getModuleFlag("cfguardtable")))
368 653 : Handlers.push_back(HandlerInfo(new WinCFGuard(this), CFGuardName,
369 0 : CFGuardDescription, DWARFGroupName,
370 : DWARFGroupDescription));
371 :
372 604 : return false;
373 : }
374 604 :
375 604 : static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI) {
376 : if (!MAI.hasWeakDefCanBeHiddenDirective())
377 : return false;
378 :
379 : return GV->canBeOmittedFromSymbolTable();
380 : }
381 :
382 : void AsmPrinter::EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
383 48576 : GlobalValue::LinkageTypes Linkage = GV->getLinkage();
384 : switch (Linkage) {
385 : case GlobalValue::CommonLinkage:
386 1 : case GlobalValue::LinkOnceAnyLinkage:
387 81774 : case GlobalValue::LinkOnceODRLinkage:
388 1 : case GlobalValue::WeakAnyLinkage:
389 : case GlobalValue::WeakODRLinkage:
390 : if (MAI->hasWeakDefDirective()) {
391 : // .globl _foo
392 27258 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Global);
393 :
394 : if (!canBeHidden(GV, *MAI))
395 : // .weak_definition _foo
396 204 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
397 : else
398 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate);
399 68 : } else if (MAI->hasLinkOnceDirective()) {
400 : // .globl _foo
401 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Global);
402 673070 : //NOTE: linkonce is handled by the section the symbol was assigned to.
403 : } else {
404 : // .weak _foo
405 214903 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Weak);
406 : }
407 : return;
408 : case GlobalValue::ExternalLinkage:
409 : // If external, declare as a global symbol: .globl _foo
410 214903 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Global);
411 : return;
412 204 : case GlobalValue::PrivateLinkage:
413 : case GlobalValue::InternalLinkage:
414 272 : return;
415 : case GlobalValue::AppendingLinkage:
416 187 : case GlobalValue::AvailableExternallyLinkage:
417 : case GlobalValue::ExternalWeakLinkage:
418 17 : llvm_unreachable("Should never emit this");
419 214699 : }
420 : llvm_unreachable("Unknown linkage type!");
421 324 : }
422 :
423 : void AsmPrinter::getNameWithPrefix(SmallVectorImpl<char> &Name,
424 : const GlobalValue *GV) const {
425 214375 : TM.getNameWithPrefix(Name, GV, getObjFileLowering().getMangler());
426 : }
427 :
428 223250 : MCSymbol *AsmPrinter::getSymbol(const GlobalValue *GV) const {
429 : return TM.getSymbol(GV);
430 223250 : }
431 223250 :
432 : /// EmitGlobalVariable - Emit the specified global variable to the .s file.
433 : void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
434 : bool IsEmuTLSVar = TM.useEmulatedTLS() && GV->isThreadLocal();
435 : assert(!(IsEmuTLSVar && GV->hasCommonLinkage()) &&
436 : "No emulated TLS variables in the common section");
437 :
438 : // Never emit TLS variable xyz in emulated TLS model.
439 : // The initialization value is in __emutls_t.xyz instead of xyz.
440 0 : if (IsEmuTLSVar)
441 : return;
442 :
443 3457070 : if (GV->hasInitializer()) {
444 : // Check to see if this is a special global used by LLVM, if so, emit it.
445 3457070 : if (EmitSpecialLLVMGlobal(GV))
446 3457070 : return;
447 :
448 1446559 : // Skip the emission of global equivalents. The symbol can be emitted later
449 1446559 : // on by emitGlobalGOTEquivs in case it turns out to be needed.
450 : if (GlobalGOTEquivs.count(getSymbol(GV)))
451 : return;
452 :
453 291166 : if (isVerbose()) {
454 291166 : // When printing the control variable __emutls_v.*,
455 : // we don't need to print the original TLS variable name.
456 : GV->printAsOperand(OutStreamer->GetCommentOS(),
457 : /*PrintType=*/false, GV->getParent());
458 : OutStreamer->GetCommentOS() << '\n';
459 : }
460 : }
461 24482 :
462 : MCSymbol *GVSym = getSymbol(GV);
463 290910 : MCSymbol *EmittedSym = GVSym;
464 :
465 274272 : // getOrCreateEmuTLSControlSym only creates the symbol with name and default
466 : // attributes.
467 : // GV's or GVSym's attributes will be used for the EmittedSym.
468 : EmitVisibility(EmittedSym, GV->getVisibility(), !GV->isDeclaration());
469 :
470 273682 : if (!GV->hasInitializer()) // External globals require no extra code.
471 9 : return;
472 :
473 273673 : GVSym->redefineIfPossible();
474 : if (GVSym->isDefined() || GVSym->isVariable())
475 : report_fatal_error("symbol '" + Twine(GVSym->getName()) +
476 24102 : "' is already defined");
477 :
478 12051 : if (MAI->hasDotTypeDotSizeDirective())
479 : OutStreamer->EmitSymbolAttribute(EmittedSym, MCSA_ELF_TypeObject);
480 :
481 : SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
482 290311 :
483 : const DataLayout &DL = GV->getParent()->getDataLayout();
484 : uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType());
485 :
486 : // If the alignment is specified, we *must* obey it. Overaligning a global
487 : // with a specified alignment is a prompt way to break globals emitted to
488 290311 : // sections and expected to be contiguous (e.g. ObjC metadata).
489 : unsigned AlignLog = getGVAlignmentLog2(GV, DL);
490 290311 :
491 : for (const HandlerInfo &HI : Handlers) {
492 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
493 : HI.TimerGroupName, HI.TimerGroupDescription,
494 273673 : TimePassesIsEnabled);
495 2 : HI.Handler->setSymbolSize(GVSym, Size);
496 : }
497 :
498 273672 : // Handle common symbols
499 271683 : if (GVKind.isCommon()) {
500 : if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
501 273672 : unsigned Align = 1 << AlignLog;
502 : if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
503 273672 : Align = 0;
504 273672 :
505 : // .comm _foo, 42, 4
506 : OutStreamer->EmitCommonSymbol(GVSym, Size, Align);
507 : return;
508 : }
509 273672 :
510 : // Determine to which section this global should be emitted.
511 820504 : MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
512 1093664 :
513 546832 : // If we have a bss global going to a section that supports the
514 1093664 : // zerofill directive, do so here.
515 546832 : if (GVKind.isBSS() && MAI->hasMachoZeroFillDirective() &&
516 : TheSection->isVirtualSection()) {
517 : if (Size == 0)
518 : Size = 1; // zerofill of 0 bytes is undefined.
519 273672 : unsigned Align = 1 << AlignLog;
520 2993 : EmitLinkage(GV, GVSym);
521 2993 : // .zerofill __DATA, __bss, _foo, 400, 5
522 2993 : OutStreamer->EmitZerofill(TheSection, GVSym, Size, Align);
523 : return;
524 : }
525 :
526 2993 : // If this is a BSS local symbol and we are emitting in the BSS
527 2993 : // section use .lcomm/.comm directive.
528 : if (GVKind.isBSSLocal() &&
529 : getObjFileLowering().getBSSSection() == TheSection) {
530 : if (Size == 0)
531 270679 : Size = 1; // .comm Foo, 0 is undefined, avoid it.
532 : unsigned Align = 1 << AlignLog;
533 :
534 : // Use .lcomm only if it supports user-specified alignment.
535 271003 : // Otherwise, while it would still be correct to use .lcomm in some
536 327 : // cases (e.g. when Align == 1), the external assembler might enfore
537 307 : // some -unknown- default alignment behavior, which could cause
538 : // spurious differences between external and integrated assembler.
539 307 : // Prefer to simply fall back to .local / .comm in this case.
540 307 : if (MAI->getLCOMMDirectiveAlignmentType() != LCOMM::NoAlignment) {
541 : // .lcomm _foo, 42
542 307 : OutStreamer->EmitLocalCommonSymbol(GVSym, Size, Align);
543 307 : return;
544 : }
545 :
546 : if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
547 : Align = 0;
548 270369 :
549 28209 : // .local _foo
550 3603 : OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Local);
551 : // .comm _foo, 42, 4
552 3603 : OutStreamer->EmitCommonSymbol(GVSym, Size, Align);
553 : return;
554 : }
555 :
556 : // Handle thread local data for mach-o which requires us to output an
557 : // additional structure of data and mangle the original symbol so that we
558 : // can reference it later.
559 : //
560 3603 : // TODO: This should become an "emit thread local global" method on TLOF.
561 : // All of this macho specific stuff should be sunk down into TLOFMachO and
562 41 : // stuff like "TLSExtraDataSection" should no longer be part of the parent
563 41 : // TLOF class. This will also make it more obvious that stuff like
564 : // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho
565 : // specific code.
566 3562 : if (GVKind.isThreadLocal() && MAI->hasMachoTBSSDirective()) {
567 : // Emit the .tbss symbol
568 : MCSymbol *MangSym =
569 : OutContext.getOrCreateSymbol(GVSym->getName() + Twine("$tlv$init"));
570 3562 :
571 : if (GVKind.isThreadBSS()) {
572 3562 : TheSection = getObjFileLowering().getTLSBSSSection();
573 3562 : OutStreamer->EmitTBSSSymbol(TheSection, MangSym, Size, 1 << AlignLog);
574 : } else if (GVKind.isThreadData()) {
575 : OutStreamer->SwitchSection(TheSection);
576 :
577 : EmitAlignment(AlignLog, GV);
578 : OutStreamer->EmitLabel(MangSym);
579 :
580 : EmitGlobalConstant(GV->getParent()->getDataLayout(),
581 : GV->getInitializer());
582 : }
583 :
584 : OutStreamer->AddBlankLine();
585 :
586 266766 : // Emit the variable struct for the runtime.
587 : MCSection *TLVSect = getObjFileLowering().getTLSExtraDataSection();
588 :
589 174 : OutStreamer->SwitchSection(TLVSect);
590 : // Emit the linkage here.
591 87 : EmitLinkage(GV, GVSym);
592 77 : OutStreamer->EmitLabel(GVSym);
593 77 :
594 : // Three pointers in size:
595 10 : // - __tlv_bootstrap - used to make sure support exists
596 : // - spare pointer, used when mapped by the runtime
597 10 : // - pointer to mangled symbol above with initializer
598 10 : unsigned PtrSize = DL.getPointerTypeSize(GV->getType());
599 : OutStreamer->EmitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
600 10 : PtrSize);
601 : OutStreamer->EmitIntValue(0, PtrSize);
602 : OutStreamer->EmitSymbolValue(MangSym, PtrSize);
603 :
604 87 : OutStreamer->AddBlankLine();
605 : return;
606 : }
607 87 :
608 : MCSymbol *EmittedInitSym = GVSym;
609 87 :
610 : OutStreamer->SwitchSection(TheSection);
611 87 :
612 87 : EmitLinkage(GV, EmittedInitSym);
613 : EmitAlignment(AlignLog, GV);
614 :
615 : OutStreamer->EmitLabel(EmittedInitSym);
616 :
617 : EmitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer());
618 :
619 87 : if (MAI->hasDotTypeDotSizeDirective())
620 : // .size foo, 42
621 87 : OutStreamer->emitELFSize(EmittedInitSym,
622 87 : MCConstantExpr::create(Size, OutContext));
623 :
624 87 : OutStreamer->AddBlankLine();
625 87 : }
626 :
627 : /// Emit the directive and value for debug thread local expression
628 : ///
629 : /// \p Value - The value to emit.
630 266679 : /// \p Size - The size of the integer (in bytes) to emit.
631 : void AsmPrinter::EmitDebugThreadLocal(const MCExpr *Value,
632 266679 : unsigned Size) const {
633 266679 : OutStreamer->EmitValue(Value, Size);
634 : }
635 266679 :
636 : /// EmitFunctionHeader - This method emits the header for the current
637 266679 : /// function.
638 : void AsmPrinter::EmitFunctionHeader() {
639 266677 : const Function &F = MF->getFunction();
640 :
641 265414 : if (isVerbose())
642 265414 : OutStreamer->GetCommentOS()
643 : << "-- Begin function "
644 266677 : << GlobalValue::dropLLVMManglingEscape(F.getName()) << '\n';
645 :
646 : // Print out constants referenced by the function
647 : EmitConstantPool();
648 :
649 : // Print the 'header' of function.
650 : OutStreamer->SwitchSection(getObjFileLowering().SectionForGlobal(&F, TM));
651 25 : EmitVisibility(CurrentFnSym, F.getVisibility());
652 :
653 25 : EmitLinkage(&F, CurrentFnSym);
654 25 : if (MAI->hasFunctionAlignment())
655 : EmitAlignment(MF->getAlignment(), &F);
656 :
657 : if (MAI->hasDotTypeDotSizeDirective())
658 405998 : OutStreamer->EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
659 405998 :
660 : if (isVerbose()) {
661 405998 : F.printAsOperand(OutStreamer->GetCommentOS(),
662 188028 : /*PrintType=*/false, F.getParent());
663 188028 : OutStreamer->GetCommentOS() << '\n';
664 188028 : }
665 :
666 : // Emit the prefix data.
667 405998 : if (F.hasPrefixData()) {
668 : if (MAI->hasSubsectionsViaSymbols()) {
669 : // Preserving prefix data on platforms which use subsections-via-symbols
670 405998 : // is a bit tricky. Here we introduce a symbol for the prefix data
671 405998 : // and use the .alt_entry attribute to mark the function's real entry point
672 : // as an alternative entry point to the prefix-data symbol.
673 405998 : MCSymbol *PrefixSym = OutContext.createLinkerPrivateTempSymbol();
674 405998 : OutStreamer->EmitLabel(PrefixSym);
675 404357 :
676 : EmitGlobalConstant(F.getParent()->getDataLayout(), F.getPrefixData());
677 405998 :
678 382740 : // Emit an .alt_entry directive for the actual function symbol.
679 : OutStreamer->EmitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
680 405998 : } else {
681 376056 : EmitGlobalConstant(F.getParent()->getDataLayout(), F.getPrefixData());
682 : }
683 188028 : }
684 :
685 : // Emit the CurrentFnSym. This is a virtual function to allow targets to
686 : // do their wild and crazy things as required.
687 405998 : EmitFunctionEntryLabel();
688 8 :
689 : // If the function had address-taken blocks that got deleted, then we have
690 : // references to the dangling symbols. Emit them at the start of the function
691 : // so that we don't get references to undefined symbols.
692 : std::vector<MCSymbol*> DeadBlockSyms;
693 4 : MMI->takeDeletedSymbolsForFunction(&F, DeadBlockSyms);
694 4 : for (unsigned i = 0, e = DeadBlockSyms.size(); i != e; ++i) {
695 : OutStreamer->AddComment("Address taken block that was later removed");
696 4 : OutStreamer->EmitLabel(DeadBlockSyms[i]);
697 : }
698 :
699 4 : if (CurrentFnBegin) {
700 : if (MAI->useAssignmentForEHBegin()) {
701 4 : MCSymbol *CurPos = OutContext.createTempSymbol();
702 : OutStreamer->EmitLabel(CurPos);
703 : OutStreamer->EmitAssignment(CurrentFnBegin,
704 : MCSymbolRefExpr::create(CurPos, OutContext));
705 : } else {
706 : OutStreamer->EmitLabel(CurrentFnBegin);
707 405998 : }
708 : }
709 :
710 : // Emit pre-function debug and/or EH information.
711 : for (const HandlerInfo &HI : Handlers) {
712 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
713 405995 : HI.TimerGroupDescription, TimePassesIsEnabled);
714 811990 : HI.Handler->beginFunction(MF);
715 0 : }
716 0 :
717 : // Emit the prologue data.
718 : if (F.hasPrologueData())
719 405995 : EmitGlobalConstant(F.getParent()->getDataLayout(), F.getPrologueData());
720 64336 : }
721 30 :
722 30 : /// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
723 30 : /// function. This can be overridden by targets as required to do custom stuff.
724 30 : void AsmPrinter::EmitFunctionEntryLabel() {
725 : CurrentFnSym->redefineIfPossible();
726 64306 :
727 : // The function label could have already been emitted if two symbols end up
728 : // conflicting due to asm renaming. Detect this and emit an error.
729 : if (CurrentFnSym->isVariable())
730 : report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
731 1190054 : "' is a protected alias");
732 2352180 : if (CurrentFnSym->isDefined())
733 1568120 : report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
734 784059 : "' label emitted multiple times to assembly file");
735 :
736 : return OutStreamer->EmitLabel(CurrentFnSym);
737 : }
738 405994 :
739 2 : /// emitComments - Pretty-print comments for instructions.
740 405994 : /// It returns true iff the sched comment was emitted.
741 : /// Otherwise it returns false.
742 : static bool emitComments(const MachineInstr &MI, raw_ostream &CommentOS,
743 : AsmPrinter *AP) {
744 372318 : const MachineFunction *MF = MI.getMF();
745 372318 : const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
746 :
747 : // Check for spills and reloads
748 : int FI;
749 744636 :
750 2 : const MachineFrameInfo &MFI = MF->getFrameInfo();
751 : bool Commented = false;
752 372317 :
753 3 : auto getSize =
754 : [&MFI](const SmallVectorImpl<const MachineMemOperand *> &Accesses) {
755 : unsigned Size = 0;
756 372316 : for (auto A : Accesses)
757 : if (MFI.isSpillSlotObjectIndex(
758 : cast<FixedStackPseudoSourceValue>(A->getPseudoValue())
759 : ->getFrameIndex()))
760 : Size += A->getSize();
761 : return Size;
762 0 : };
763 :
764 0 : // We assume a single instruction only has a spill or reload, not
765 0 : // both.
766 : const MachineMemOperand *MMO;
767 : SmallVector<const MachineMemOperand *, 2> Accesses;
768 : if (TII->isLoadFromStackSlotPostFE(MI, FI)) {
769 : if (MFI.isSpillSlotObjectIndex(FI)) {
770 0 : MMO = *MI.memoperands_begin();
771 : CommentOS << MMO->getSize() << "-byte Reload";
772 : Commented = true;
773 : }
774 : } else if (TII->hasLoadFromStackSlot(MI, Accesses)) {
775 : if (auto Size = getSize(Accesses)) {
776 : CommentOS << Size << "-byte Folded Reload";
777 : Commented = true;
778 : }
779 : } else if (TII->isStoreToStackSlotPostFE(MI, FI)) {
780 : if (MFI.isSpillSlotObjectIndex(FI)) {
781 : MMO = *MI.memoperands_begin();
782 0 : CommentOS << MMO->getSize() << "-byte Spill";
783 : Commented = true;
784 : }
785 : } else if (TII->hasStoreToStackSlot(MI, Accesses)) {
786 : if (auto Size = getSize(Accesses)) {
787 : CommentOS << Size << "-byte Folded Spill";
788 0 : Commented = true;
789 0 : }
790 0 : }
791 0 :
792 : // Check for spill-induced copies
793 : if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse)) {
794 0 : Commented = true;
795 0 : CommentOS << " Reload Reuse";
796 0 : }
797 :
798 : if (Commented) {
799 0 : if (AP->EnablePrintSchedInfo) {
800 0 : // If any comment was added above and we need sched info comment then add
801 0 : // this new comment just after the above comment w/o "\n" between them.
802 0 : CommentOS << " " << MF->getSubtarget().getSchedInfoStr(MI) << "\n";
803 : return true;
804 : }
805 0 : CommentOS << "\n";
806 0 : }
807 0 : return false;
808 : }
809 :
810 : /// emitImplicitDef - This method emits the specified machine instruction
811 : /// that is an implicit def.
812 : void AsmPrinter::emitImplicitDef(const MachineInstr *MI) const {
813 0 : unsigned RegNo = MI->getOperand(0).getReg();
814 :
815 0 : SmallString<128> Str;
816 : raw_svector_ostream OS(Str);
817 : OS << "implicit-def: "
818 0 : << printReg(RegNo, MF->getSubtarget().getRegisterInfo());
819 0 :
820 : OutStreamer->AddComment(OS.str());
821 : OutStreamer->AddBlankLine();
822 0 : }
823 0 :
824 : static void emitKill(const MachineInstr *MI, AsmPrinter &AP) {
825 0 : std::string Str;
826 : raw_string_ostream OS(Str);
827 : OS << "kill:";
828 : for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
829 : const MachineOperand &Op = MI->getOperand(i);
830 : assert(Op.isReg() && "KILL instruction must have only register operands");
831 : OS << ' ' << (Op.isDef() ? "def " : "killed ")
832 3460 : << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
833 3460 : }
834 : AP.OutStreamer->AddComment(OS.str());
835 : AP.OutStreamer->AddBlankLine();
836 : }
837 :
838 6920 : /// emitDebugValueComment - This method handles the target-independent form
839 : /// of DBG_VALUE, returning true if it was able to do so. A false return
840 10380 : /// means the target will need to handle MI in EmitInstruction.
841 3460 : static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
842 3460 : // This code handles only the 4-operand target-independent form.
843 : if (MI->getNumOperands() != 4)
844 12425 : return false;
845 :
846 12425 : SmallString<128> Str;
847 12425 : raw_svector_ostream OS(Str);
848 51077 : OS << "DEBUG_VALUE: ";
849 38652 :
850 : const DILocalVariable *V = MI->getDebugVariable();
851 : if (auto *SP = dyn_cast<DISubprogram>(V->getScope())) {
852 97109 : StringRef Name = SP->getName();
853 : if (!Name.empty())
854 24850 : OS << Name << ":";
855 12425 : }
856 12425 : OS << V->getName();
857 : OS << " <- ";
858 :
859 : // The second operand is only an offset if it's an immediate.
860 : bool MemLoc = MI->getOperand(0).isReg() && MI->getOperand(1).isImm();
861 888 : int64_t Offset = MemLoc ? MI->getOperand(1).getImm() : 0;
862 : const DIExpression *Expr = MI->getDebugExpression();
863 888 : if (Expr->getNumElements()) {
864 : OS << '[';
865 : bool NeedSep = false;
866 : for (auto Op : Expr->expr_ops()) {
867 : if (NeedSep)
868 888 : OS << ", ";
869 : else
870 888 : NeedSep = true;
871 : OS << dwarf::OperationEncodingString(Op.getOp());
872 721 : for (unsigned I = 0; I < Op.getNumArgs(); ++I)
873 721 : OS << ' ' << Op.getArg(I);
874 719 : }
875 : OS << "] ";
876 888 : }
877 888 :
878 : // Register or immediate value. Register 0 means undef.
879 : if (MI->getOperand(0).isFPImm()) {
880 1776 : APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF());
881 97 : if (MI->getOperand(0).getFPImm()->getType()->isFloatTy()) {
882 888 : OS << (double)APF.convertToFloat();
883 888 : } else if (MI->getOperand(0).getFPImm()->getType()->isDoubleTy()) {
884 : OS << APF.convertToDouble();
885 : } else {
886 414 : // There is no good way to print long double. Convert a copy to
887 267 : // double. Ah well, it's only a comment.
888 120 : bool ignored;
889 : APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven,
890 : &ignored);
891 534 : OS << "(long double) " << APF.convertToDouble();
892 577 : }
893 310 : } else if (MI->getOperand(0).isImm()) {
894 : OS << MI->getOperand(0).getImm();
895 147 : } else if (MI->getOperand(0).isCImm()) {
896 : MI->getOperand(0).getCImm()->getValue().print(OS, false /*isSigned*/);
897 : } else {
898 : unsigned Reg;
899 1776 : if (MI->getOperand(0).isReg()) {
900 1 : Reg = MI->getOperand(0).getReg();
901 2 : } else {
902 0 : assert(MI->getOperand(0).isFI() && "Unknown operand type");
903 1 : const TargetFrameLowering *TFI = AP.MF->getSubtarget().getFrameLowering();
904 1 : Offset += TFI->getFrameIndexReference(*AP.MF,
905 : MI->getOperand(0).getIndex(), Reg);
906 : MemLoc = true;
907 : }
908 : if (Reg == 0) {
909 0 : // Suppress offset, it is not meaningful here.
910 : OS << "undef";
911 0 : // NOTE: Want this comment at start of line, don't emit with AddComment.
912 : AP.OutStreamer->emitRawComment(OS.str());
913 887 : return true;
914 50 : }
915 837 : if (MemLoc)
916 2 : OS << '[';
917 : OS << printReg(Reg, AP.MF->getSubtarget().getRegisterInfo());
918 : }
919 836 :
920 836 : if (MemLoc)
921 : OS << '+' << Offset << ']';
922 :
923 0 : // NOTE: Want this comment at start of line, don't emit with AddComment.
924 0 : AP.OutStreamer->emitRawComment(OS.str());
925 0 : return true;
926 : }
927 :
928 836 : /// This method handles the target-independent form of DBG_LABEL, returning
929 : /// true if it was able to do so. A false return means the target will need
930 17 : /// to handle MI in EmitInstruction.
931 : static bool emitDebugLabelComment(const MachineInstr *MI, AsmPrinter &AP) {
932 51 : if (MI->getNumOperands() != 1)
933 17 : return false;
934 :
935 819 : SmallString<128> Str;
936 : raw_svector_ostream OS(Str);
937 1638 : OS << "DEBUG_LABEL: ";
938 :
939 : const DILabel *V = MI->getDebugLabel();
940 871 : if (auto *SP = dyn_cast<DISubprogram>(V->getScope())) {
941 97 : StringRef Name = SP->getName();
942 : if (!Name.empty())
943 : OS << Name << ":";
944 2613 : }
945 871 : OS << V->getName();
946 :
947 : // NOTE: Want this comment at start of line, don't emit with AddComment.
948 : AP.OutStreamer->emitRawComment(OS.str());
949 : return true;
950 : }
951 2 :
952 2 : AsmPrinter::CFIMoveType AsmPrinter::needsCFIMoves() const {
953 : if (MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI &&
954 : MF->getFunction().needsUnwindTableEntry())
955 : return CFI_M_EH;
956 :
957 2 : if (MMI->hasDebugInfo())
958 : return CFI_M_Debug;
959 2 :
960 : return CFI_M_None;
961 2 : }
962 2 :
963 2 : bool AsmPrinter::needsSEHMoves() {
964 : return MAI->usesWindowsCFI() && MF->getFunction().needsUnwindTableEntry();
965 2 : }
966 :
967 : void AsmPrinter::emitCFIInstruction(const MachineInstr &MI) {
968 6 : ExceptionHandling ExceptionHandlingType = MAI->getExceptionHandlingType();
969 : if (ExceptionHandlingType != ExceptionHandling::DwarfCFI &&
970 : ExceptionHandlingType != ExceptionHandling::ARM)
971 : return;
972 1368591 :
973 2709274 : if (needsCFIMoves() == CFI_M_None)
974 1340684 : return;
975 :
976 : // If there is no "real" instruction following this CFI instruction, skip
977 82098 : // emitting it; it would be beyond the end of the function's FDE range.
978 4635 : auto *MBB = MI.getParent();
979 : auto I = std::next(MI.getIterator());
980 : while (I != MBB->end() && I->isTransient())
981 : ++I;
982 : if (I == MBB->instr_end() &&
983 2494 : MBB->getReverseIterator() == MBB->getParent()->rbegin())
984 4057 : return;
985 :
986 : const std::vector<MCCFIInstruction> &Instrs = MF->getFrameInstructions();
987 999813 : unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
988 999813 : const MCCFIInstruction &CFI = Instrs[CFIIndex];
989 1999626 : emitCFIInstruction(CFI);
990 999813 : }
991 :
992 : void AsmPrinter::emitFrameAlloc(const MachineInstr &MI) {
993 992435 : // The operands are the MCSymbol and the frame offset of the allocation.
994 : MCSymbol *FrameAllocSym = MI.getOperand(0).getMCSymbol();
995 : int FrameOffset = MI.getOperand(1).getImm();
996 :
997 : // Emit a symbol assignment.
998 974302 : OutStreamer->EmitAssignment(FrameAllocSym,
999 974302 : MCConstantExpr::create(FrameOffset, OutContext));
1000 1399243 : }
1001 :
1002 974302 : void AsmPrinter::emitStackSizeSection(const MachineFunction &MF) {
1003 4480 : if (!MF.getTarget().Options.EmitStackSizeSection)
1004 : return;
1005 :
1006 973881 : MCSection *StackSizeSection =
1007 973881 : getObjFileLowering().getStackSizesSection(*getCurrentSection());
1008 973881 : if (!StackSizeSection)
1009 973881 : return;
1010 :
1011 : const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1012 17 : // Don't emit functions with dynamic stack allocations.
1013 : if (FrameInfo.hasVarSizedObjects())
1014 17 : return;
1015 17 :
1016 : OutStreamer->PushSection();
1017 : OutStreamer->SwitchSection(StackSizeSection);
1018 17 :
1019 17 : const MCSymbol *FunctionSymbol = getFunctionBegin();
1020 17 : uint64_t StackSize = FrameInfo.getStackSize();
1021 : OutStreamer->EmitSymbolValue(FunctionSymbol, TM.getProgramPointerSize());
1022 405995 : OutStreamer->EmitULEB128IntValue(StackSize);
1023 405995 :
1024 : OutStreamer->PopSection();
1025 : }
1026 :
1027 20 : static bool needFuncLabelsForEHOrDebugInfo(const MachineFunction &MF,
1028 20 : MachineModuleInfo *MMI) {
1029 : if (!MF.getLandingPads().empty() || MF.hasEHFunclets() || MMI->hasDebugInfo())
1030 : return true;
1031 20 :
1032 : // We might emit an EH table that uses function begin and end labels even if
1033 20 : // we don't have any landingpads.
1034 : if (!MF.getFunction().hasPersonalityFn())
1035 : return false;
1036 17 : return !isNoOpWithoutInvoke(
1037 17 : classifyEHPersonality(MF.getFunction().getPersonalityFn()));
1038 : }
1039 17 :
1040 17 : /// EmitFunctionBody - This method emits the body and trailer for a
1041 17 : /// function.
1042 17 : void AsmPrinter::EmitFunctionBody() {
1043 : EmitFunctionHeader();
1044 17 :
1045 : // Emit target-specific gunk before the function body.
1046 : EmitFunctionBodyStart();
1047 811993 :
1048 : bool ShouldPrintDebugScopes = MMI->hasDebugInfo();
1049 811993 :
1050 : if (isVerbose()) {
1051 : // Get MachineDominatorTree or compute it on the fly if it's unavailable
1052 : MDT = getAnalysisIfAvailable<MachineDominatorTree>();
1053 : if (!MDT) {
1054 1404990 : OwnedMDT = make_unique<MachineDominatorTree>();
1055 : OwnedMDT->getBase().recalculate(*MF);
1056 24426 : MDT = OwnedMDT.get();
1057 48852 : }
1058 :
1059 : // Get MachineLoopInfo or compute it on the fly if it's unavailable
1060 : MLI = getAnalysisIfAvailable<MachineLoopInfo>();
1061 : if (!MLI) {
1062 405998 : OwnedMLI = make_unique<MachineLoopInfo>();
1063 405998 : OwnedMLI->getBase().analyze(MDT->getBase());
1064 : MLI = OwnedMLI.get();
1065 : }
1066 405994 : }
1067 :
1068 405995 : // Print out code for the function.
1069 : bool HasAnyRealCode = false;
1070 405995 : int NumInstsInFunction = 0;
1071 : for (auto &MBB : *MF) {
1072 188025 : // Print a label for the basic block.
1073 188025 : EmitBasicBlockStart(MBB);
1074 : for (auto &MI : MBB) {
1075 186891 : // Print the assembly for the instruction.
1076 186891 : if (!MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
1077 : !MI.isDebugInstr()) {
1078 : HasAnyRealCode = true;
1079 : ++NumInstsInFunction;
1080 188025 : }
1081 188025 :
1082 : // If there is a pre-instruction symbol, emit a label for it here.
1083 186891 : if (MCSymbol *S = MI.getPreInstrSymbol())
1084 186891 : OutStreamer->EmitLabel(S);
1085 :
1086 : if (ShouldPrintDebugScopes) {
1087 : for (const HandlerInfo &HI : Handlers) {
1088 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
1089 : HI.TimerGroupName, HI.TimerGroupDescription,
1090 : TimePassesIsEnabled);
1091 3687254 : HI.Handler->beginInstruction(&MI);
1092 : }
1093 3281259 : }
1094 37683014 :
1095 : if (isVerbose() && emitComments(MI, OutStreamer->GetCommentOS(), this)) {
1096 32069904 : MachineInstr *MIP = const_cast<MachineInstr *>(&MI);
1097 : MIP->setAsmPrinterFlag(MachineInstr::NoSchedComment);
1098 : }
1099 31736244 :
1100 : switch (MI.getOpcode()) {
1101 : case TargetOpcode::CFI_INSTRUCTION:
1102 : emitCFIInstruction(MI);
1103 34401755 : break;
1104 3 : case TargetOpcode::LOCAL_ESCAPE:
1105 : emitFrameAlloc(MI);
1106 34401756 : break;
1107 6219863 : case TargetOpcode::EH_LABEL:
1108 8291838 : case TargetOpcode::GC_LABEL:
1109 4145919 : OutStreamer->EmitLabel(MI.getOperand(0).getMCSymbol());
1110 8291838 : break;
1111 4145919 : case TargetOpcode::INLINEASM:
1112 : EmitInlineAsm(&MI);
1113 : break;
1114 : case TargetOpcode::DBG_VALUE:
1115 34401755 : if (isVerbose()) {
1116 : if (!emitDebugValueComment(&MI, *this))
1117 : EmitInstruction(&MI);
1118 : }
1119 : break;
1120 68803510 : case TargetOpcode::DBG_LABEL:
1121 999813 : if (isVerbose()) {
1122 999813 : if (!emitDebugLabelComment(&MI, *this))
1123 999813 : EmitInstruction(&MI);
1124 17 : }
1125 17 : break;
1126 17 : case TargetOpcode::IMPLICIT_DEF:
1127 1332038 : if (isVerbose()) emitImplicitDef(&MI);
1128 : break;
1129 1332038 : case TargetOpcode::KILL:
1130 1332038 : if (isVerbose()) emitKill(&MI, *this);
1131 16628 : break;
1132 16628 : default:
1133 16628 : EmitInstruction(&MI);
1134 300668 : break;
1135 300668 : }
1136 888 :
1137 0 : // If there is a post-instruction symbol, emit a label for it here.
1138 : if (MCSymbol *S = MI.getPostInstrSymbol())
1139 : OutStreamer->EmitLabel(S);
1140 6 :
1141 6 : if (ShouldPrintDebugScopes) {
1142 2 : for (const HandlerInfo &HI : Handlers) {
1143 0 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
1144 : HI.TimerGroupName, HI.TimerGroupDescription,
1145 : TimePassesIsEnabled);
1146 4106 : HI.Handler->endInstruction();
1147 4106 : }
1148 : }
1149 28880 : }
1150 28880 :
1151 : EmitBasicBlockEnd(MBB);
1152 31719599 : }
1153 31719599 :
1154 31719598 : EmittedInsts += NumInstsInFunction;
1155 : MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionCount",
1156 : MF->getFunction().getSubprogram(),
1157 : &MF->front());
1158 34401754 : R << ore::NV("NumInstructions", NumInstsInFunction)
1159 54 : << " instructions in function";
1160 : ORE->emit(R);
1161 34401755 :
1162 6219865 : // If the function is empty and the object file uses .subsections_via_symbols,
1163 8291840 : // then we need to emit *something* to the function body to prevent the
1164 4145920 : // labels from collapsing together. Just emit a noop.
1165 8291840 : // Similarly, don't emit empty functions on Windows either. It can lead to
1166 4145920 : // duplicate entries (two functions with the same RVA) in the Guard CF Table
1167 : // after linking, causing the kernel not to load the binary:
1168 : // https://developercommunity.visualstudio.com/content/problem/45366/vc-linker-creates-invalid-dll-with-clang-cl.html
1169 : // FIXME: Hide this behind some API in e.g. MCAsmInfo or MCTargetStreamer.
1170 : const Triple &TT = TM.getTargetTriple();
1171 3281259 : if (!HasAnyRealCode && (MAI->hasSubsectionsViaSymbols() ||
1172 : (TT.isOSWindows() && TT.isOSBinFormatCOFF()))) {
1173 : MCInst Noop;
1174 : MF->getSubtarget().getInstrInfo()->getNoop(Noop);
1175 :
1176 405995 : // Targets can opt-out of emitting the noop here by leaving the opcode
1177 405995 : // unspecified.
1178 405995 : if (Noop.getOpcode()) {
1179 811989 : OutStreamer->AddComment("avoids zero-length function");
1180 405995 : OutStreamer->EmitInstruction(Noop, getSubtargetInfo());
1181 : }
1182 : }
1183 :
1184 : const Function &F = MF->getFunction();
1185 : for (const auto &BB : F) {
1186 : if (!BB.hasAddressTaken())
1187 : continue;
1188 : MCSymbol *Sym = GetBlockAddressSymbol(&BB);
1189 : if (Sym->isDefined())
1190 405995 : continue;
1191 405995 : OutStreamer->AddComment("Address of block that was removed by CodeGen");
1192 1 : OutStreamer->EmitLabel(Sym);
1193 : }
1194 1 :
1195 : // Emit target-specific gunk after the function body.
1196 : EmitFunctionBodyEnd();
1197 :
1198 1 : if (needFuncLabelsForEHOrDebugInfo(*MF, MMI) ||
1199 2 : MAI->hasDotTypeDotSizeDirective()) {
1200 1 : // Create a symbol for the end of function.
1201 : CurrentFnEnd = createTempSymbol("func_end");
1202 : OutStreamer->EmitLabel(CurrentFnEnd);
1203 : }
1204 405995 :
1205 3624986 : // If the target wants a .size directive for the size of the function, emit
1206 3218991 : // it.
1207 : if (MAI->hasDotTypeDotSizeDirective()) {
1208 616 : // We can get the size as difference between the function label and the
1209 616 : // temp label.
1210 : const MCExpr *SizeExp = MCBinaryExpr::createSub(
1211 254 : MCSymbolRefExpr::create(CurrentFnEnd, OutContext),
1212 127 : MCSymbolRefExpr::create(CurrentFnSymForSize, OutContext), OutContext);
1213 : OutStreamer->emitELFSize(CurrentFnSym, SizeExp);
1214 : }
1215 :
1216 405995 : for (const HandlerInfo &HI : Handlers) {
1217 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1218 405995 : HI.TimerGroupDescription, TimePassesIsEnabled);
1219 351240 : HI.Handler->markFunctionEnd();
1220 : }
1221 383862 :
1222 383862 : // Print out jump tables referenced by the function.
1223 : EmitJumpTableInfo();
1224 :
1225 : // Emit post-function debug and/or EH information.
1226 : for (const HandlerInfo &HI : Handlers) {
1227 405995 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1228 : HI.TimerGroupDescription, TimePassesIsEnabled);
1229 : HI.Handler->endFunction(MF);
1230 382738 : }
1231 382738 :
1232 382738 : // Emit section containing stack size metadata.
1233 382738 : emitStackSizeSection(*MF);
1234 :
1235 : if (isVerbose())
1236 1190054 : OutStreamer->GetCommentOS() << "-- End function\n";
1237 2352177 :
1238 1568118 : OutStreamer->AddBlankLine();
1239 784060 : }
1240 :
1241 : /// Compute the number of Global Variables that uses a Constant.
1242 : static unsigned getNumGlobalVariableUses(const Constant *C) {
1243 405995 : if (!C)
1244 : return 0;
1245 :
1246 1190055 : if (isa<GlobalVariable>(C))
1247 2352180 : return 1;
1248 1568120 :
1249 784060 : unsigned NumUses = 0;
1250 : for (auto *CU : C->users())
1251 : NumUses += getNumGlobalVariableUses(dyn_cast<Constant>(CU));
1252 :
1253 405995 : return NumUses;
1254 : }
1255 405995 :
1256 188025 : /// Only consider global GOT equivalents if at least one user is a
1257 : /// cstexpr inside an initializer of another global variables. Also, don't
1258 405995 : /// handle cstexpr inside instructions. During global variable emission,
1259 405995 : /// candidates are skipped and are emitted later in case at least one cstexpr
1260 : /// isn't replaced by a PC relative GOT entry access.
1261 : static bool isGOTEquivalentCandidate(const GlobalVariable *GV,
1262 119 : unsigned &NumGOTEquivUsers) {
1263 119 : // Global GOT equivalents are unnamed private globals with a constant
1264 : // pointer initializer to another global symbol. They must point to a
1265 : // GlobalVariable or Function, i.e., as GlobalValue.
1266 113 : if (!GV->hasGlobalUnnamedAddr() || !GV->hasInitializer() ||
1267 : !GV->isConstant() || !GV->isDiscardableIfUnused() ||
1268 : !dyn_cast<GlobalValue>(GV->getOperand(0)))
1269 : return false;
1270 196 :
1271 104 : // To be a got equivalent, at least one of its users need to be a constant
1272 : // expression used by another global variable.
1273 : for (auto *U : GV->users())
1274 : NumGOTEquivUsers += getNumGlobalVariableUses(dyn_cast<Constant>(U));
1275 :
1276 : return NumGOTEquivUsers > 0;
1277 : }
1278 :
1279 : /// Unnamed constant global variables solely contaning a pointer to
1280 : /// another globals variable is equivalent to a GOT table entry; it contains the
1281 2295 : /// the address of another symbol. Optimize it and replace accesses to these
1282 : /// "GOT equivalents" by using the GOT entry for the final global instead.
1283 : /// Compute GOT equivalent candidates among all global variables to avoid
1284 : /// emitting them if possible later on, after it use is replaced by a GOT entry
1285 : /// access.
1286 293 : void AsmPrinter::computeGlobalGOTEquivs(Module &M) {
1287 2295 : if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
1288 : return;
1289 2279 :
1290 : for (const auto &G : M.globals()) {
1291 : unsigned NumGOTEquivUsers = 0;
1292 : if (!isGOTEquivalentCandidate(&G, NumGOTEquivUsers))
1293 31 : continue;
1294 15 :
1295 : const MCSymbol *GOTEquivSym = getSymbol(&G);
1296 16 : GlobalGOTEquivs[GOTEquivSym] = std::make_pair(&G, NumGOTEquivUsers);
1297 : }
1298 : }
1299 :
1300 : /// Constant expressions using GOT equivalent globals may not be eligible
1301 : /// for PC relative GOT entry conversion, in such cases we need to emit such
1302 : /// globals we previously omitted in EmitGlobalVariable.
1303 : void AsmPrinter::emitGlobalGOTEquivs() {
1304 : if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
1305 : return;
1306 27127 :
1307 27127 : SmallVector<const GlobalVariable *, 8> FailedCandidates;
1308 : for (auto &I : GlobalGOTEquivs) {
1309 : const GlobalVariable *GV = I.second.first;
1310 4763 : unsigned Cnt = I.second.second;
1311 2295 : if (Cnt)
1312 2295 : FailedCandidates.push_back(GV);
1313 2286 : }
1314 : GlobalGOTEquivs.clear();
1315 9 :
1316 9 : for (auto *GV : FailedCandidates)
1317 : EmitGlobalVariable(GV);
1318 : }
1319 :
1320 : void AsmPrinter::emitGlobalIndirectSymbol(Module &M,
1321 : const GlobalIndirectSymbol& GIS) {
1322 : MCSymbol *Name = getSymbol(&GIS);
1323 27119 :
1324 27119 : if (GIS.hasExternalLinkage() || !MAI->getWeakRefDirective())
1325 24653 : OutStreamer->EmitSymbolAttribute(Name, MCSA_Global);
1326 : else if (GIS.hasWeakLinkage() || GIS.hasLinkOnceLinkage())
1327 : OutStreamer->EmitSymbolAttribute(Name, MCSA_WeakReference);
1328 2476 : else
1329 9 : assert(GIS.hasLocalLinkage() && "Invalid alias or ifunc linkage");
1330 9 :
1331 9 : // Set the symbol type to function if the alias has a function type.
1332 3 : // This affects codegen when the aliasee is not a function.
1333 : if (GIS.getType()->getPointerElementType()->isFunctionTy()) {
1334 : OutStreamer->EmitSymbolAttribute(Name, MCSA_ELF_TypeFunction);
1335 : if (isa<GlobalIFunc>(GIS))
1336 2470 : OutStreamer->EmitSymbolAttribute(Name, MCSA_ELF_TypeIndFunction);
1337 3 : }
1338 :
1339 : EmitVisibility(Name, GIS.getVisibility());
1340 867 :
1341 : const MCExpr *Expr = lowerConstant(GIS.getIndirectSymbol());
1342 867 :
1343 : if (isa<GlobalAlias>(&GIS) && MAI->hasAltEntry() && isa<MCBinaryExpr>(Expr))
1344 867 : OutStreamer->EmitSymbolAttribute(Name, MCSA_AltEntry);
1345 598 :
1346 25 : // Emit the directives as assignments aka .set:
1347 245 : OutStreamer->EmitAssignment(Name, Expr);
1348 :
1349 : if (auto *GA = dyn_cast<GlobalAlias>(&GIS)) {
1350 : // If the aliasee does not correspond to a symbol in the output, i.e. the
1351 : // alias is not of an object or the aliased object is private, then set the
1352 : // size of the alias symbol from the type of the alias. We don't do this in
1353 1734 : // other situations as the alias and aliasee having differing types but same
1354 593 : // size may be intentional.
1355 593 : const GlobalObject *BaseObject = GA->getBaseObject();
1356 6 : if (MAI->hasDotTypeDotSizeDirective() && GA->getValueType()->isSized() &&
1357 : (!BaseObject || BaseObject->hasPrivateLinkage())) {
1358 : const DataLayout &DL = M.getDataLayout();
1359 867 : uint64_t Size = DL.getTypeAllocSize(GA->getValueType());
1360 : OutStreamer->emitELFSize(Name, MCConstantExpr::create(Size, OutContext));
1361 867 : }
1362 : }
1363 867 : }
1364 4 :
1365 : bool AsmPrinter::doFinalization(Module &M) {
1366 : // Set the MachineFunction to nullptr so that we can catch attempted
1367 867 : // accesses to MF specific features at the module level and so that
1368 : // we can conditionalize accesses based on whether or not it is nullptr.
1369 : MF = nullptr;
1370 :
1371 : // Gather all GOT equivalent globals in the module. We really need two
1372 : // passes over the globals: one to compute and another to avoid its emission
1373 : // in EmitGlobalVariable, otherwise we would not be able to handle cases
1374 : // where the got equivalent shows up before its use.
1375 861 : computeGlobalGOTEquivs(M);
1376 861 :
1377 149 : // Emit global variables.
1378 88 : for (const auto &G : M.globals())
1379 88 : EmitGlobalVariable(&G);
1380 88 :
1381 : // Emit remaining GOT equivalent globals.
1382 : emitGlobalGOTEquivs();
1383 867 :
1384 : // Emit visibility info for declarations
1385 27127 : for (const Function &F : M) {
1386 : if (!F.isDeclarationForLinker())
1387 : continue;
1388 : GlobalValue::VisibilityTypes V = F.getVisibility();
1389 27127 : if (V == GlobalValue::DefaultVisibility)
1390 : continue;
1391 :
1392 : MCSymbol *Name = getSymbol(&F);
1393 : EmitVisibility(Name, V, false);
1394 : }
1395 27127 :
1396 : const TargetLoweringObjectFile &TLOF = getObjFileLowering();
1397 :
1398 318684 : TLOF.emitModuleMetadata(*OutStreamer, M);
1399 291564 :
1400 : if (TM.getTargetTriple().isOSBinFormatELF()) {
1401 : MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
1402 27120 :
1403 : // Output stubs for external and common global variables.
1404 : MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
1405 592639 : if (!Stubs.empty()) {
1406 1131013 : OutStreamer->SwitchSection(TLOF.getDataSection());
1407 : const DataLayout &DL = M.getDataLayout();
1408 :
1409 159526 : EmitAlignment(Log2_32(DL.getPointerSize()));
1410 : for (const auto &Stub : Stubs) {
1411 : OutStreamer->EmitLabel(Stub.first);
1412 110 : OutStreamer->EmitSymbolValue(Stub.second.getPointer(),
1413 110 : DL.getPointerSize());
1414 : }
1415 : }
1416 27120 : }
1417 :
1418 54240 : if (TM.getTargetTriple().isOSBinFormatCOFF()) {
1419 : MachineModuleInfoCOFF &MMICOFF =
1420 54240 : MMI->getObjFileInfo<MachineModuleInfoCOFF>();
1421 23592 :
1422 : // Output stubs for external and common global variables.
1423 : MachineModuleInfoCOFF::SymbolListTy Stubs = MMICOFF.GetGVStubList();
1424 : if (!Stubs.empty()) {
1425 23592 : const DataLayout &DL = M.getDataLayout();
1426 27 :
1427 27 : for (const auto &Stub : Stubs) {
1428 : SmallString<256> SectionName = StringRef(".rdata$");
1429 54 : SectionName += Stub.first->getName();
1430 57 : OutStreamer->SwitchSection(OutContext.getCOFFSection(
1431 31 : SectionName,
1432 31 : COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
1433 : COFF::IMAGE_SCN_LNK_COMDAT,
1434 : SectionKind::getReadOnly(), Stub.first->getName(),
1435 : COFF::IMAGE_COMDAT_SELECT_ANY));
1436 : EmitAlignment(Log2_32(DL.getPointerSize()));
1437 : OutStreamer->EmitSymbolAttribute(Stub.first, MCSA_Global);
1438 54238 : OutStreamer->EmitLabel(Stub.first);
1439 : OutStreamer->EmitSymbolValue(Stub.second.getPointer(),
1440 760 : DL.getPointerSize());
1441 : }
1442 : }
1443 : }
1444 760 :
1445 13 : // Finalize debug and EH information.
1446 : for (const HandlerInfo &HI : Handlers) {
1447 28 : NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1448 : HI.TimerGroupDescription, TimePassesIsEnabled);
1449 15 : HI.Handler->endModule();
1450 15 : delete HI.Handler;
1451 : }
1452 : Handlers.clear();
1453 : DD = nullptr;
1454 15 :
1455 15 : // If the target wants to know about weak references, print them all.
1456 30 : if (MAI->getWeakRefDirective()) {
1457 15 : // FIXME: This is not lazy, it would be nice to only print weak references
1458 15 : // to stuff that is actually used. Note that doing so would require targets
1459 15 : // to notice uses in operands (due to constant exprs etc). This should
1460 : // happen with the MC stuff eventually.
1461 :
1462 : // Print out module-level global objects here.
1463 : for (const auto &GO : M.global_objects()) {
1464 : if (!GO.hasExternalWeakLinkage())
1465 : continue;
1466 78262 : OutStreamer->EmitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
1467 153429 : }
1468 102286 : }
1469 51144 :
1470 51143 : OutStreamer->AddBlankLine();
1471 :
1472 : // Print aliases in topological order, that is, for each alias a = b,
1473 27119 : // b must be printed before a.
1474 : // This is because on some targets (e.g. PowerPC) linker expects aliases in
1475 : // such an order to generate correct TOC information.
1476 27119 : SmallVector<const GlobalAlias *, 16> AliasStack;
1477 : SmallPtrSet<const GlobalAlias *, 16> AliasVisited;
1478 : for (const auto &Alias : M.aliases()) {
1479 : for (const GlobalAlias *Cur = &Alias; Cur;
1480 : Cur = dyn_cast<GlobalAlias>(Cur->getAliasee())) {
1481 : if (!AliasVisited.insert(Cur).second)
1482 : break;
1483 : AliasStack.push_back(Cur);
1484 854385 : }
1485 : for (const GlobalAlias *AncestorAlias : llvm::reverse(AliasStack))
1486 110 : emitGlobalIndirectSymbol(M, *AncestorAlias);
1487 : AliasStack.clear();
1488 : }
1489 : for (const auto &IFunc : M.ifuncs())
1490 27118 : emitGlobalIndirectSymbol(M, IFunc);
1491 :
1492 : GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
1493 : assert(MI && "AsmPrinter didn't require GCModuleInfo?");
1494 : for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
1495 : if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(**--I))
1496 : MP->finishAssembly(M, *MI, *this);
1497 :
1498 27980 : // Emit llvm.ident metadata in an '.ident' directive.
1499 1722 : EmitModuleIdents(M);
1500 1722 :
1501 863 : // Emit __morestack address if needed for indirect calls.
1502 : if (MMI->usesMorestackAddr()) {
1503 861 : unsigned Align = 1;
1504 : MCSection *ReadOnlySection = getObjFileLowering().getSectionForConstant(
1505 1723 : getDataLayout(), SectionKind::getReadOnly(),
1506 861 : /*C=*/nullptr, Align);
1507 : OutStreamer->SwitchSection(ReadOnlySection);
1508 :
1509 27125 : MCSymbol *AddrSymbol =
1510 6 : OutContext.getOrCreateSymbol(StringRef("__morestack_addr"));
1511 : OutStreamer->EmitLabel(AddrSymbol);
1512 27119 :
1513 : unsigned PtrSize = MAI->getCodePointerSize();
1514 27144 : OutStreamer->EmitSymbolValue(GetExternalSymbolSymbol("__morestack"),
1515 50 : PtrSize);
1516 6 : }
1517 :
1518 : // Emit .note.GNU-split-stack and .note.GNU-no-split-stack sections if
1519 27119 : // split-stack is used.
1520 : if (TM.getTargetTriple().isOSBinFormatELF() && MMI->hasSplitStack()) {
1521 : OutStreamer->SwitchSection(
1522 27119 : OutContext.getELFSection(".note.GNU-split-stack", ELF::SHT_PROGBITS, 0));
1523 1 : if (MMI->hasNosplitStack())
1524 2 : OutStreamer->SwitchSection(
1525 : OutContext.getELFSection(".note.GNU-no-split-stack", ELF::SHT_PROGBITS, 0));
1526 1 : }
1527 1 :
1528 : // If we don't have any trampolines, then we don't require stack memory
1529 : // to be executable. Some targets have a directive to declare this.
1530 2 : Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
1531 1 : if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
1532 : if (MCSection *S = MAI->getNonexecutableStackSection(OutContext))
1533 1 : OutStreamer->SwitchSection(S);
1534 1 :
1535 : if (TM.getTargetTriple().isOSBinFormatCOFF()) {
1536 : // Emit /EXPORT: flags for each exported global as necessary.
1537 : const auto &TLOF = getObjFileLowering();
1538 : std::string Flags;
1539 :
1540 54238 : for (const GlobalValue &GV : M.global_values()) {
1541 39 : raw_string_ostream OS(Flags);
1542 39 : TLOF.emitLinkerFlagsForGlobal(OS, &GV);
1543 39 : OS.flush();
1544 13 : if (!Flags.empty()) {
1545 26 : OutStreamer->SwitchSection(TLOF.getDrectveSection());
1546 : OutStreamer->EmitBytes(Flags);
1547 : }
1548 : Flags.clear();
1549 : }
1550 27119 :
1551 27119 : // Emit /INCLUDE: flags for each used global as necessary.
1552 27115 : if (const auto *LU = M.getNamedGlobal("llvm.used")) {
1553 23205 : assert(LU->hasInitializer() &&
1554 : "expected llvm.used to have an initializer");
1555 54238 : assert(isa<ArrayType>(LU->getValueType()) &&
1556 : "expected llvm.used to be an array type");
1557 759 : if (const auto *A = cast<ConstantArray>(LU->getInitializer())) {
1558 : for (const Value *Op : A->operands()) {
1559 : const auto *GV =
1560 7331 : cast<GlobalValue>(Op->stripPointerCastsNoFollowAliases());
1561 5813 : // Global symbols with internal or private linkage are not visible to
1562 5813 : // the linker, and thus would cause an error when the linker tried to
1563 : // preserve the symbol due to the `/include:` directive.
1564 5813 : if (GV->hasLocalLinkage())
1565 249 : continue;
1566 498 :
1567 : raw_string_ostream OS(Flags);
1568 : TLOF.emitLinkerFlagsForUsed(OS, GV);
1569 : OS.flush();
1570 :
1571 : if (!Flags.empty()) {
1572 759 : OutStreamer->SwitchSection(TLOF.getDrectveSection());
1573 : OutStreamer->EmitBytes(Flags);
1574 : }
1575 : Flags.clear();
1576 : }
1577 3 : }
1578 19 : }
1579 : }
1580 13 :
1581 : if (TM.Options.EmitAddrsig) {
1582 : // Emit address-significance attributes for all globals.
1583 : OutStreamer->EmitAddrsig();
1584 : for (const GlobalValue &GV : M.global_values())
1585 5 : if (!GV.use_empty() && !GV.isThreadLocal() &&
1586 : !GV.hasDLLImportStorageClass() && !GV.getName().startswith("llvm.") &&
1587 8 : !GV.hasAtLeastLocalUnnamedAddr())
1588 8 : OutStreamer->EmitAddrsigSym(getSymbol(&GV));
1589 : }
1590 :
1591 8 : // Allow the target to emit any magic that it wants at the end of the file,
1592 8 : // after everything else has gone out.
1593 16 : EmitEndOfAsmFile(M);
1594 :
1595 : MMI = nullptr;
1596 :
1597 : OutStreamer->Finish();
1598 : OutStreamer->reset();
1599 : OwnedMLI.reset();
1600 : OwnedMDT.reset();
1601 27119 :
1602 : return false;
1603 6255 : }
1604 576020 :
1605 542631 : MCSymbol *AsmPrinter::getCurExceptionSym() {
1606 1648738 : if (!CurExceptionSym)
1607 : CurExceptionSym = createTempSymbol("exception");
1608 237782 : return CurExceptionSym;
1609 : }
1610 :
1611 : void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
1612 : this->MF = &MF;
1613 27119 : // Get the function symbol.
1614 : CurrentFnSym = getSymbol(&MF.getFunction());
1615 27119 : CurrentFnSymForSize = CurrentFnSym;
1616 : CurrentFnBegin = nullptr;
1617 27119 : CurExceptionSym = nullptr;
1618 27118 : bool NeedsLocalForSize = MAI->needsLocalForSize();
1619 : if (needFuncLabelsForEHOrDebugInfo(MF, MMI) || NeedsLocalForSize ||
1620 : MF.getTarget().Options.EmitStackSizeSection) {
1621 : CurrentFnBegin = createTempSymbol("func_begin");
1622 27118 : if (NeedsLocalForSize)
1623 : CurrentFnSymForSize = CurrentFnBegin;
1624 : }
1625 93504 :
1626 93504 : ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
1627 46780 :
1628 93504 : const TargetSubtargetInfo &STI = MF.getSubtarget();
1629 : EnablePrintSchedInfo = PrintSchedule.getNumOccurrences()
1630 : ? PrintSchedule
1631 405998 : : STI.supportPrintSchedInfo();
1632 405998 : }
1633 :
1634 405998 : namespace {
1635 405998 :
1636 405998 : // Keep track the alignment, constpool entries per Section.
1637 405998 : struct SectionCPs {
1638 405998 : MCSection *S;
1639 405998 : unsigned Alignment;
1640 341682 : SmallVector<unsigned, 4> CPEs;
1641 64336 :
1642 64336 : SectionCPs(MCSection *s, unsigned a) : S(s), Alignment(a) {}
1643 9577 : };
1644 :
1645 : } // end anonymous namespace
1646 405998 :
1647 : /// EmitConstantPool - Print to the current output stream assembly
1648 405998 : /// representations of the constants in the constant pool MCP. This is
1649 811996 : /// used to print out constants which have been "spilled to memory" by
1650 405998 : /// the code generator.
1651 390979 : void AsmPrinter::EmitConstantPool() {
1652 405998 : const MachineConstantPool *MCP = MF->getConstantPool();
1653 : const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
1654 : if (CP.empty()) return;
1655 :
1656 : // Calculate sections for constant pool entries. We collect entries to go into
1657 41904 : // the same section together to reduce amount of section switch statements.
1658 : SmallVector<SectionCPs, 4> CPSections;
1659 : for (unsigned i = 0, e = CP.size(); i != e; ++i) {
1660 : const MachineConstantPoolEntry &CPE = CP[i];
1661 : unsigned Align = CPE.getAlignment();
1662 20952 :
1663 : SectionKind Kind = CPE.getSectionKind(&getDataLayout());
1664 :
1665 : const Constant *C = nullptr;
1666 : if (!CPE.isMachineConstantPoolEntry())
1667 : C = CPE.Val.ConstVal;
1668 :
1669 : MCSection *S = getObjFileLowering().getSectionForConstant(getDataLayout(),
1670 : Kind, C, Align);
1671 388047 :
1672 388047 : // The number of sections are small, just do a linear search from the
1673 : // last section to the first.
1674 388047 : bool Found = false;
1675 : unsigned SecIdx = CPSections.size();
1676 : while (SecIdx != 0) {
1677 : if (CPSections[--SecIdx].S == S) {
1678 19918 : Found = true;
1679 70041 : break;
1680 30205 : }
1681 30205 : }
1682 : if (!Found) {
1683 30205 : SecIdx = CPSections.size();
1684 : CPSections.push_back(SectionCPs(S, Align));
1685 : }
1686 60410 :
1687 30188 : if (Align > CPSections[SecIdx].Alignment)
1688 : CPSections[SecIdx].Alignment = Align;
1689 60410 : CPSections[SecIdx].CPEs.push_back(i);
1690 30205 : }
1691 :
1692 : // Now print stuff into the calculated sections.
1693 : const MCSection *CurSection = nullptr;
1694 : unsigned Offset = 0;
1695 30205 : for (unsigned i = 0, e = CPSections.size(); i != e; ++i) {
1696 32226 : for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) {
1697 22548 : unsigned CPI = CPSections[i].CPEs[j];
1698 : MCSymbol *Sym = GetCPISymbol(CPI);
1699 : if (!Sym->isUndefined())
1700 : continue;
1701 :
1702 30205 : if (CurSection != CPSections[i].S) {
1703 : OutStreamer->SwitchSection(CPSections[i].S);
1704 62856 : EmitAlignment(Log2_32(CPSections[i].Alignment));
1705 : CurSection = CPSections[i].S;
1706 : Offset = 0;
1707 60410 : }
1708 0 :
1709 30205 : MachineConstantPoolEntry CPE = CP[CPI];
1710 :
1711 : // Emit inter-object padding for alignment.
1712 : unsigned AlignMask = CPE.getAlignment() - 1;
1713 : unsigned NewOffset = (Offset + AlignMask) & ~AlignMask;
1714 : OutStreamer->EmitZeros(NewOffset - Offset);
1715 40870 :
1716 72109 : Type *Ty = CPE.getType();
1717 30205 : Offset = NewOffset + getDataLayout().getTypeAllocSize(Ty);
1718 30205 :
1719 30205 : OutStreamer->EmitLabel(Sym);
1720 19 : if (CPE.isMachineConstantPoolEntry())
1721 : EmitMachineConstantPoolValue(CPE.Val.MachineCPVal);
1722 30186 : else
1723 20933 : EmitGlobalConstant(getDataLayout(), CPE.Val.ConstVal);
1724 41866 : }
1725 20933 : }
1726 : }
1727 :
1728 : /// EmitJumpTableInfo - Print assembly representations of the jump tables used
1729 30186 : /// by the current function to the current output stream.
1730 : void AsmPrinter::EmitJumpTableInfo() {
1731 : const DataLayout &DL = MF->getDataLayout();
1732 30186 : const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
1733 30186 : if (!MJTI) return;
1734 30186 : if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return;
1735 : const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
1736 30186 : if (JT.empty()) return;
1737 30186 :
1738 : // Pick the directive to use to print the jump table entries, and switch to
1739 30186 : // the appropriate section.
1740 60372 : const Function &F = MF->getFunction();
1741 17 : const TargetLoweringObjectFile &TLOF = getObjFileLowering();
1742 : bool JTInDiffSection = !TLOF.shouldPutJumpTableInFunctionSection(
1743 30169 : MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32,
1744 : F);
1745 : if (JTInDiffSection) {
1746 : // Drop it in the readonly section.
1747 : MCSection *ReadOnlySection = TLOF.getSectionForJumpTable(F, TM);
1748 : OutStreamer->SwitchSection(ReadOnlySection);
1749 : }
1750 403013 :
1751 403013 : EmitAlignment(Log2_32(MJTI->getEntryAlignment(DL)));
1752 403013 :
1753 403013 : // Jump tables in code sections are marked with a data_region directive
1754 2183 : // where that's supported.
1755 : if (!JTInDiffSection)
1756 2111 : OutStreamer->EmitDataRegion(MCDR_DataRegionJT32);
1757 :
1758 : for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
1759 : const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1760 2111 :
1761 2111 : // If this jump table was deleted, ignore it.
1762 2111 : if (JTBBs.empty()) continue;
1763 2111 :
1764 2111 : // For the EK_LabelDifference32 entry, if using .set avoids a relocation,
1765 2111 : /// emit a .set directive for each unique entry.
1766 : if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 &&
1767 2094 : MAI->doesSetDirectiveSuppressReloc()) {
1768 2094 : SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets;
1769 : const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
1770 : const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext);
1771 4222 : for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
1772 : const MachineBasicBlock *MBB = JTBBs[ii];
1773 : if (!EmittedSets.insert(MBB).second)
1774 : continue;
1775 2111 :
1776 17 : // .set LJTSet, LBB32-base
1777 : const MCExpr *LHS =
1778 7382 : MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
1779 3160 : OutStreamer->EmitAssignment(GetJTSetSymbol(JTI, MBB->getNumber()),
1780 : MCBinaryExpr::createSub(LHS, Base,
1781 : OutContext));
1782 3160 : }
1783 : }
1784 :
1785 : // On some targets (e.g. Darwin) we want to emit two consecutive labels
1786 3160 : // before each jump table. The first label is never referenced, but tells
1787 126 : // the assembler and linker the extents of the jump table object. The
1788 : // second label is actually referenced by the code.
1789 14 : if (JTInDiffSection && DL.hasLinkerPrivateGlobalPrefix())
1790 14 : // FIXME: This doesn't have to have any specific name, just any randomly
1791 725 : // named and numbered 'l' label would work. Simplify GetJTISymbol.
1792 697 : OutStreamer->EmitLabel(GetJTISymbol(JTI, true));
1793 697 :
1794 : OutStreamer->EmitLabel(GetJTISymbol(JTI));
1795 :
1796 : for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii)
1797 : EmitJumpTableEntry(MJTI, JTBBs[ii], JTI);
1798 172 : }
1799 172 : if (!JTInDiffSection)
1800 172 : OutStreamer->EmitDataRegion(MCDR_DataRegionEnd);
1801 172 : }
1802 :
1803 : /// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
1804 : /// current stream.
1805 : void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI,
1806 : const MachineBasicBlock *MBB,
1807 : unsigned UID) const {
1808 : assert(MBB && MBB->getNumber() >= 0 && "Invalid basic block");
1809 3160 : const MCExpr *Value = nullptr;
1810 : switch (MJTI->getEntryKind()) {
1811 : case MachineJumpTableInfo::EK_Inline:
1812 6 : llvm_unreachable("Cannot emit EK_Inline jump table entry");
1813 : case MachineJumpTableInfo::EK_Custom32:
1814 3160 : Value = MF->getSubtarget().getTargetLowering()->LowerCustomJumpTableEntry(
1815 : MJTI, MBB, UID, OutContext);
1816 77598 : break;
1817 142556 : case MachineJumpTableInfo::EK_BlockAddress:
1818 : // EK_BlockAddress - Each entry is a plain address of block, e.g.:
1819 2111 : // .word LBB123
1820 17 : Value = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
1821 : break;
1822 : case MachineJumpTableInfo::EK_GPRel32BlockAddress: {
1823 : // EK_GPRel32BlockAddress - Each entry is an address of block, encoded
1824 : // with a relocation as gp-relative, e.g.:
1825 71278 : // .gprel32 LBB123
1826 : MCSymbol *MBBSym = MBB->getSymbol();
1827 : OutStreamer->EmitGPRel32Value(MCSymbolRefExpr::create(MBBSym, OutContext));
1828 : return;
1829 : }
1830 71278 :
1831 : case MachineJumpTableInfo::EK_GPRel64BlockAddress: {
1832 : // EK_GPRel64BlockAddress - Each entry is an address of block, encoded
1833 419 : // with a relocation as gp-relative, e.g.:
1834 419 : // .gpdword LBB123
1835 419 : MCSymbol *MBBSym = MBB->getSymbol();
1836 419 : OutStreamer->EmitGPRel64Value(MCSymbolRefExpr::create(MBBSym, OutContext));
1837 67981 : return;
1838 : }
1839 :
1840 67981 : case MachineJumpTableInfo::EK_LabelDifference32: {
1841 67981 : // Each entry is the address of the block minus the address of the jump
1842 18 : // table. This is used for PIC jump tables where gprel32 is not supported.
1843 : // e.g.:
1844 : // .word LBB123 - LJTI1_2
1845 : // If the .set directive avoids relocations, this is emitted as:
1846 18 : // .set L4_5_set_123, LBB123 - LJTI1_2
1847 18 : // .word L4_5_set_123
1848 18 : if (MAI->doesSetDirectiveSuppressReloc()) {
1849 : Value = MCSymbolRefExpr::create(GetJTSetSymbol(UID, MBB->getNumber()),
1850 : OutContext);
1851 33 : break;
1852 : }
1853 : Value = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
1854 : const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
1855 33 : const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF, UID, OutContext);
1856 33 : Value = MCBinaryExpr::createSub(Value, Base, OutContext);
1857 33 : break;
1858 : }
1859 : }
1860 2827 :
1861 : assert(Value && "Unknown entry kind!");
1862 :
1863 : unsigned EntrySize = MJTI->getEntrySize(getDataLayout());
1864 : OutStreamer->EmitValue(Value, EntrySize);
1865 : }
1866 :
1867 : /// EmitSpecialLLVMGlobal - Check to see if the specified global is a
1868 2827 : /// special global used by LLVM. If so, emit it and return true, otherwise
1869 697 : /// do nothing and return false.
1870 : bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
1871 697 : if (GV->getName() == "llvm.used") {
1872 : if (MAI->hasNoDeadStrip()) // No need to emit this at all.
1873 2130 : EmitLLVMUsedList(cast<ConstantArray>(GV->getInitializer()));
1874 2130 : return true;
1875 2130 : }
1876 2130 :
1877 2130 : // Ignore debug and non-emitted data. This handles llvm.compiler.used.
1878 : if (GV->getSection() == "llvm.metadata" ||
1879 : GV->hasAvailableExternallyLinkage())
1880 : return true;
1881 :
1882 : if (!GV->hasAppendingLinkage()) return false;
1883 71227 :
1884 71227 : assert(GV->hasInitializer() && "Not a special LLVM global!");
1885 :
1886 : if (GV->getName() == "llvm.global_ctors") {
1887 : EmitXXStructorList(GV->getParent()->getDataLayout(), GV->getInitializer(),
1888 : /* isCtor */ true);
1889 :
1890 274323 : return true;
1891 274323 : }
1892 62 :
1893 32 : if (GV->getName() == "llvm.global_dtors") {
1894 62 : EmitXXStructorList(GV->getParent()->getDataLayout(), GV->getInitializer(),
1895 : /* isCtor */ false);
1896 :
1897 : return true;
1898 548475 : }
1899 :
1900 : report_fatal_error("unknown special variable");
1901 : }
1902 274167 :
1903 : /// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
1904 : /// global in the specified llvm.used list for which emitUsedDirectiveFor
1905 : /// is true, as being used with this directive.
1906 434 : void AsmPrinter::EmitLLVMUsedList(const ConstantArray *InitList) {
1907 420 : // Should be an array of 'i8*'.
1908 : for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
1909 : const GlobalValue *GV =
1910 420 : dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
1911 : if (GV)
1912 : OutStreamer->EmitSymbolAttribute(getSymbol(GV), MCSA_NoDeadStrip);
1913 14 : }
1914 13 : }
1915 :
1916 : namespace {
1917 13 :
1918 : struct Structor {
1919 : int Priority = 0;
1920 1 : Constant *Func = nullptr;
1921 : GlobalValue *ComdatKey = nullptr;
1922 :
1923 : Structor() = default;
1924 : };
1925 :
1926 32 : } // end anonymous namespace
1927 :
1928 95 : /// EmitXXStructorList - Emit the ctor or dtor list taking into account the init
1929 : /// priority.
1930 63 : void AsmPrinter::EmitXXStructorList(const DataLayout &DL, const Constant *List,
1931 : bool isCtor) {
1932 63 : // Should be an array of '{ int, void ()* }' structs. The first value is the
1933 : // init priority.
1934 32 : if (!isa<ConstantArray>(List)) return;
1935 :
1936 : // Sanity check the structors list.
1937 : const ConstantArray *InitList = dyn_cast<ConstantArray>(List);
1938 : if (!InitList) return; // Not an array!
1939 : StructType *ETy = dyn_cast<StructType>(InitList->getType()->getElementType());
1940 : // FIXME: Only allow the 3-field form in LLVM 4.0.
1941 : if (!ETy || ETy->getNumElements() < 2 || ETy->getNumElements() > 3)
1942 : return; // Not an array of two or three elements!
1943 : if (!isa<IntegerType>(ETy->getTypeAtIndex(0U)) ||
1944 : !isa<PointerType>(ETy->getTypeAtIndex(1U))) return; // Not (int, ptr).
1945 : if (ETy->getNumElements() == 3 && !isa<PointerType>(ETy->getTypeAtIndex(2U)))
1946 : return; // Not (int, ptr, ptr).
1947 :
1948 : // Gather the structors in a form that's convenient for sorting by priority.
1949 : SmallVector<Structor, 8> Structors;
1950 433 : for (Value *O : InitList->operands()) {
1951 : ConstantStruct *CS = dyn_cast<ConstantStruct>(O);
1952 : if (!CS) continue; // Malformed.
1953 : if (CS->getOperand(1)->isNullValue())
1954 433 : break; // Found a null terminator, skip the rest.
1955 : ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0));
1956 : if (!Priority) continue; // Malformed.
1957 : Structors.push_back(Structor());
1958 : Structor &S = Structors.back();
1959 427 : S.Priority = Priority->getLimitedValue(65535);
1960 : S.Func = CS->getOperand(1);
1961 427 : if (ETy->getNumElements() == 3 && !CS->getOperand(2)->isNullValue())
1962 : S.ComdatKey =
1963 854 : dyn_cast<GlobalValue>(CS->getOperand(2)->stripPointerCasts());
1964 427 : }
1965 427 :
1966 : // Emit the function pointers in the target-specific order
1967 : unsigned Align = Log2_32(DL.getPointerPrefAlignment());
1968 : std::stable_sort(Structors.begin(), Structors.end(),
1969 427 : [](const Structor &L,
1970 1404 : const Structor &R) { return L.Priority < R.Priority; });
1971 : for (Structor &S : Structors) {
1972 : const TargetLoweringObjectFile &Obj = getObjFileLowering();
1973 550 : const MCSymbol *KeySym = nullptr;
1974 : if (GlobalValue *GV = S.ComdatKey) {
1975 : if (GV->isDeclarationForLinker())
1976 : // If the associated variable is not defined in this module
1977 550 : // (it might be available_externally, or have been an
1978 : // available_externally definition that was dropped by the
1979 550 : // EliminateAvailableExternally pass), some other TU
1980 550 : // will provide its dynamic initializer.
1981 1047 : continue;
1982 37 :
1983 : KeySym = getSymbol(GV);
1984 : }
1985 : MCSection *OutputSection =
1986 : (isCtor ? Obj.getStaticCtorSection(S.Priority, KeySym)
1987 427 : : Obj.getStaticDtorSection(S.Priority, KeySym));
1988 : OutStreamer->SwitchSection(OutputSection);
1989 : if (OutStreamer->getCurrentSection() != OutStreamer->getPreviousSection())
1990 0 : EmitAlignment(Align);
1991 977 : EmitXXStructor(DL, S.Func);
1992 550 : }
1993 : }
1994 550 :
1995 33 : void AsmPrinter::EmitModuleIdents(Module &M) {
1996 : if (!MAI->hasIdentDirective())
1997 : return;
1998 :
1999 : if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
2000 : for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2001 8 : const MDNode *N = NMD->getOperand(i);
2002 : assert(N->getNumOperands() == 1 &&
2003 29 : "llvm.ident metadata entry can have only one operand");
2004 : const MDString *S = cast<MDString>(N->getOperand(0));
2005 : OutStreamer->EmitIdent(S->getString());
2006 542 : }
2007 17 : }
2008 542 : }
2009 :
2010 526 : //===--------------------------------------------------------------------===//
2011 542 : // Emission and print routines
2012 : //
2013 :
2014 : /// Emit a byte directive and value.
2015 27119 : ///
2016 27119 : void AsmPrinter::emitInt8(int Value) const {
2017 : OutStreamer->EmitIntValue(Value, 1);
2018 : }
2019 23510 :
2020 13171 : /// Emit a short directive and value.
2021 6624 : void AsmPrinter::emitInt16(int Value) const {
2022 : OutStreamer->EmitIntValue(Value, 2);
2023 : }
2024 :
2025 6624 : /// Emit a long directive and value.
2026 : void AsmPrinter::emitInt32(int Value) const {
2027 : OutStreamer->EmitIntValue(Value, 4);
2028 : }
2029 :
2030 : /// Emit a long long directive and value.
2031 : void AsmPrinter::emitInt64(uint64_t Value) const {
2032 : OutStreamer->EmitIntValue(Value, 8);
2033 : }
2034 :
2035 : /// Emit something like ".long Hi-Lo" where the size in bytes of the directive
2036 315299 : /// is specified by Size and Hi/Lo specify the labels. This implicitly uses
2037 315299 : /// .set if it avoids relocations.
2038 315300 : void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
2039 : unsigned Size) const {
2040 : OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size);
2041 96219 : }
2042 96219 :
2043 96219 : /// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
2044 : /// where the size in bytes of the directive is specified by Size and Label
2045 : /// specifies the label. This implicitly uses .set if it is available.
2046 28692 : void AsmPrinter::EmitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
2047 28692 : unsigned Size,
2048 28692 : bool IsSectionRelative) const {
2049 : if (MAI->needsDwarfSectionOffsetDirective() && IsSectionRelative) {
2050 : OutStreamer->EmitCOFFSecRel32(Label, Offset);
2051 24 : if (Size > 4)
2052 24 : OutStreamer->EmitZeros(Size - 4);
2053 24 : return;
2054 : }
2055 :
2056 : // Emit Label+Offset (or just Label if Offset is zero)
2057 : const MCExpr *Expr = MCSymbolRefExpr::create(Label, OutContext);
2058 98819 : if (Offset)
2059 : Expr = MCBinaryExpr::createAdd(
2060 98819 : Expr, MCConstantExpr::create(Offset, OutContext), OutContext);
2061 98820 :
2062 : OutStreamer->EmitValue(Expr, Size);
2063 : }
2064 :
2065 : //===----------------------------------------------------------------------===//
2066 319881 :
2067 : // EmitAlignment - Emit an alignment directive to the specified power of
2068 : // two boundary. For example, if you pass in 3 here, you will get an 8
2069 319881 : // byte alignment. If a global value is specified, and if that global has
2070 268 : // an explicit alignment requested, it will override the alignment request
2071 268 : // if required for correctness.
2072 2 : void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalObject *GV) const {
2073 268 : if (GV)
2074 : NumBits = getGVAlignmentLog2(GV, GV->getParent()->getDataLayout(), NumBits);
2075 :
2076 : if (NumBits == 0) return; // 1-byte aligned: no need to emit alignment.
2077 319613 :
2078 319613 : assert(NumBits <
2079 300 : static_cast<unsigned>(std::numeric_limits<unsigned>::digits) &&
2080 300 : "undefined behavior");
2081 : if (getCurrentSection()->getKind().isText())
2082 319613 : OutStreamer->EmitCodeAlignment(1u << NumBits);
2083 : else
2084 : OutStreamer->EmitValueToAlignment(1u << NumBits);
2085 : }
2086 :
2087 : //===----------------------------------------------------------------------===//
2088 : // Constant emission.
2089 : //===----------------------------------------------------------------------===//
2090 :
2091 : const MCExpr *AsmPrinter::lowerConstant(const Constant *CV) {
2092 825304 : MCContext &Ctx = OutContext;
2093 825304 :
2094 671214 : if (CV->isNullValue() || isa<UndefValue>(CV))
2095 : return MCConstantExpr::create(0, Ctx);
2096 825303 :
2097 : if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
2098 : return MCConstantExpr::create(CI->getZExtValue(), Ctx);
2099 :
2100 : if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
2101 620908 : return MCSymbolRefExpr::create(getSymbol(GV), Ctx);
2102 407135 :
2103 : if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
2104 213774 : return MCSymbolRefExpr::create(GetBlockAddressSymbol(BA), Ctx);
2105 :
2106 : const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
2107 : if (!CE) {
2108 : llvm_unreachable("Unknown constant value to lower!");
2109 : }
2110 :
2111 343374 : switch (CE->getOpcode()) {
2112 343374 : default:
2113 : // If the code isn't optimized, there may be outstanding folding
2114 343374 : // opportunities. Attempt to fold the expression using DataLayout as a
2115 1 : // last resort before giving up.
2116 : if (Constant *C = ConstantFoldConstant(CE, getDataLayout()))
2117 : if (C != CE)
2118 11351 : return lowerConstant(C);
2119 :
2120 : // Otherwise report the problem to the user.
2121 377334 : {
2122 : std::string S;
2123 : raw_string_ostream OS(S);
2124 348 : OS << "Unsupported expression in static initializer: ";
2125 : CE->printAsOperand(OS, /*PrintType=*/false,
2126 : !MF ? nullptr : MF->getFunction().getParent());
2127 : report_fatal_error(OS.str());
2128 0 : }
2129 : case Instruction::GetElementPtr: {
2130 : // Generate a symbolic expression for the byte address
2131 143181 : APInt OffsetAI(getDataLayout().getPointerTypeSizeInBits(CE->getType()), 0);
2132 2 : cast<GEPOperator>(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
2133 :
2134 : const MCExpr *Base = lowerConstant(CE->getOperand(0));
2135 : if (!OffsetAI)
2136 2 : return Base;
2137 2 :
2138 0 : int64_t Offset = OffsetAI.getSExtValue();
2139 : return MCBinaryExpr::createAdd(Base, MCConstantExpr::create(Offset, Ctx),
2140 : Ctx);
2141 : }
2142 :
2143 : case Instruction::Trunc:
2144 2 : // We emit the value and depend on the assembler to truncate the generated
2145 2 : // expression properly. This is important for differences between
2146 2 : // blockaddress labels. Since the two labels are in the same function, it
2147 2 : // is reasonable to treat their delta as a 32-bit value.
2148 : LLVM_FALLTHROUGH;
2149 131307 : case Instruction::BitCast:
2150 : return lowerConstant(CE->getOperand(0));
2151 131307 :
2152 131307 : case Instruction::IntToPtr: {
2153 : const DataLayout &DL = getDataLayout();
2154 131307 :
2155 131307 : // Handle casts to pointers by changing them into casts to the appropriate
2156 : // integer type. This promotes constant folding and simplifies this code.
2157 : Constant *Op = CE->getOperand(0);
2158 : Op = ConstantExpr::getIntegerCast(Op, DL.getIntPtrType(CV->getType()),
2159 13318 : false/*ZExt*/);
2160 13318 : return lowerConstant(Op);
2161 : }
2162 :
2163 336 : case Instruction::PtrToInt: {
2164 : const DataLayout &DL = getDataLayout();
2165 :
2166 : // Support only foldable casts to/from pointers that can be eliminated by
2167 : // changing the pointer to the appropriately sized integer type.
2168 : Constant *Op = CE->getOperand(0);
2169 : Type *Ty = CE->getType();
2170 336 :
2171 : const MCExpr *OpExpr = lowerConstant(Op);
2172 11339 :
2173 11339 : // We can emit the pointer value into this slot if the slot is an
2174 : // integer slot equal to the size of the pointer.
2175 : if (DL.getTypeAllocSize(Ty) == DL.getTypeAllocSize(Op->getType()))
2176 : return OpExpr;
2177 :
2178 11339 : // Otherwise the pointer is smaller than the resultant integer, mask off
2179 : // the high bits so we are sure to get a proper truncation if the input is
2180 11339 : // a constant expr.
2181 : unsigned InBits = DL.getTypeAllocSizeInBits(Op->getType());
2182 : const MCExpr *MaskExpr = MCConstantExpr::create(~0ULL >> (64-InBits), Ctx);
2183 51 : return MCBinaryExpr::createAnd(OpExpr, MaskExpr, Ctx);
2184 51 : }
2185 :
2186 : case Instruction::Sub: {
2187 : GlobalValue *LHSGV;
2188 : APInt LHSOffset;
2189 51 : if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHSGV, LHSOffset,
2190 : getDataLayout())) {
2191 51 : GlobalValue *RHSGV;
2192 : APInt RHSOffset;
2193 : if (IsConstantOffsetFromGlobal(CE->getOperand(1), RHSGV, RHSOffset,
2194 : getDataLayout())) {
2195 51 : const MCExpr *RelocExpr =
2196 : getObjFileLowering().lowerRelativeReference(LHSGV, RHSGV, TM);
2197 : if (!RelocExpr)
2198 : RelocExpr = MCBinaryExpr::createSub(
2199 : MCSymbolRefExpr::create(getSymbol(LHSGV), Ctx),
2200 : MCSymbolRefExpr::create(getSymbol(RHSGV), Ctx), Ctx);
2201 3 : int64_t Addend = (LHSOffset - RHSOffset).getSExtValue();
2202 3 : if (Addend != 0)
2203 3 : RelocExpr = MCBinaryExpr::createAdd(
2204 : RelocExpr, MCConstantExpr::create(Addend, Ctx), Ctx);
2205 : return RelocExpr;
2206 : }
2207 : }
2208 : }
2209 270 : // else fallthrough
2210 : LLVM_FALLTHROUGH;
2211 :
2212 : // The MC library also has a right-shift operator, but it isn't consistently
2213 244 : // signed or unsigned between different targets.
2214 : case Instruction::Add:
2215 : case Instruction::Mul:
2216 122 : case Instruction::SDiv:
2217 122 : case Instruction::SRem:
2218 : case Instruction::Shl:
2219 30 : case Instruction::And:
2220 30 : case Instruction::Or:
2221 122 : case Instruction::Xor: {
2222 122 : const MCExpr *LHS = lowerConstant(CE->getOperand(0));
2223 : const MCExpr *RHS = lowerConstant(CE->getOperand(1));
2224 24 : switch (CE->getOpcode()) {
2225 : default: llvm_unreachable("Unknown binary operator constant cast expr");
2226 : case Instruction::Add: return MCBinaryExpr::createAdd(LHS, RHS, Ctx);
2227 135 : case Instruction::Sub: return MCBinaryExpr::createSub(LHS, RHS, Ctx);
2228 : case Instruction::Mul: return MCBinaryExpr::createMul(LHS, RHS, Ctx);
2229 : case Instruction::SDiv: return MCBinaryExpr::createDiv(LHS, RHS, Ctx);
2230 : case Instruction::SRem: return MCBinaryExpr::createMod(LHS, RHS, Ctx);
2231 : case Instruction::Shl: return MCBinaryExpr::createShl(LHS, RHS, Ctx);
2232 : case Instruction::And: return MCBinaryExpr::createAnd(LHS, RHS, Ctx);
2233 : case Instruction::Or: return MCBinaryExpr::createOr (LHS, RHS, Ctx);
2234 : case Instruction::Xor: return MCBinaryExpr::createXor(LHS, RHS, Ctx);
2235 : }
2236 : }
2237 : }
2238 : }
2239 :
2240 : static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C,
2241 : AsmPrinter &AP,
2242 24 : const Constant *BaseCV = nullptr,
2243 24 : uint64_t Offset = 0);
2244 24 :
2245 0 : static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP);
2246 10 : static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP);
2247 13 :
2248 1 : /// isRepeatedByteSequence - Determine whether the given value is
2249 0 : /// composed of a repeated sequence of identical bytes and return the
2250 0 : /// byte value. If it is not a repeated sequence, return -1.
2251 0 : static int isRepeatedByteSequence(const ConstantDataSequential *V) {
2252 0 : StringRef Data = V->getRawDataValues();
2253 0 : assert(!Data.empty() && "Empty aggregates should be CAZ node");
2254 0 : char C = Data[0];
2255 : for (unsigned i = 1, e = Data.size(); i != e; ++i)
2256 : if (Data[i] != C) return -1;
2257 : return static_cast<uint8_t>(C); // Ensure 255 is not returned as -1.
2258 : }
2259 :
2260 : /// isRepeatedByteSequence - Determine whether the given value is
2261 : /// composed of a repeated sequence of identical bytes and return the
2262 : /// byte value. If it is not a repeated sequence, return -1.
2263 : static int isRepeatedByteSequence(const Value *V, const DataLayout &DL) {
2264 : if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
2265 : uint64_t Size = DL.getTypeAllocSizeInBits(V->getType());
2266 : assert(Size % 8 == 0);
2267 :
2268 : // Extend the element to take zero padding into account.
2269 : APInt Value = CI->getValue().zextOrSelf(Size);
2270 : if (!Value.isSplat(8))
2271 223841 : return -1;
2272 223841 :
2273 : return Value.zextOrTrunc(8).getZExtValue();
2274 : }
2275 335351 : if (const ConstantArray *CA = dyn_cast<ConstantArray>(V)) {
2276 665470 : // Make sure all array elements are sequences of the same repeated
2277 2616 : // byte.
2278 : assert(CA->getNumOperands() != 0 && "Should be a CAZ");
2279 : Constant *Op0 = CA->getOperand(0);
2280 : int Byte = isRepeatedByteSequence(Op0, DL);
2281 : if (Byte == -1)
2282 : return -1;
2283 305818 :
2284 : // All array elements must be equal.
2285 6 : for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i)
2286 : if (CA->getOperand(i) != Op0)
2287 : return -1;
2288 : return Byte;
2289 6 : }
2290 6 :
2291 : if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(V))
2292 : return isRepeatedByteSequence(CDS);
2293 10 :
2294 : return -1;
2295 : }
2296 :
2297 : static void emitGlobalConstantDataSequential(const DataLayout &DL,
2298 : const ConstantDataSequential *CDS,
2299 40998 : AsmPrinter &AP) {
2300 40998 : // See if we can aggregate this into a .fill, if so, emit it as such.
2301 40998 : int Value = isRepeatedByteSequence(CDS, DL);
2302 : if (Value != -1) {
2303 : uint64_t Bytes = DL.getTypeAllocSize(CDS->getType());
2304 : // Don't emit a 1-byte object as a .fill.
2305 12 : if (Bytes > 1)
2306 9 : return AP.OutStreamer->emitFill(Bytes, Value);
2307 : }
2308 :
2309 : // If this can be emitted with .ascii/.asciz, emit it as such.
2310 : if (CDS->isString())
2311 : return AP.OutStreamer->EmitBytes(CDS->getAsString());
2312 223841 :
2313 : // Otherwise, emit the values in successive locations.
2314 : unsigned ElementByteSize = CDS->getElementByteSize();
2315 : if (isa<IntegerType>(CDS->getElementType())) {
2316 : for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2317 223823 : if (AP.isVerbose())
2318 : AP.OutStreamer->GetCommentOS() << format("0x%" PRIx64 "\n",
2319 : CDS->getElementAsInteger(i));
2320 : AP.OutStreamer->EmitIntValue(CDS->getElementAsInteger(i),
2321 223823 : ElementByteSize);
2322 223823 : }
2323 2614 : } else {
2324 : Type *ET = CDS->getElementType();
2325 2614 : for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I)
2326 2588 : emitGlobalConstantFP(CDS->getElementAsAPFloat(I), ET, AP);
2327 : }
2328 :
2329 : unsigned Size = DL.getTypeAllocSize(CDS->getType());
2330 221235 : unsigned EmittedSize = DL.getTypeAllocSize(CDS->getType()->getElementType()) *
2331 192643 : CDS->getNumElements();
2332 : assert(EmittedSize <= Size && "Size cannot be less than EmittedSize!");
2333 : if (unsigned Padding = Size - EmittedSize)
2334 28592 : AP.OutStreamer->EmitZeros(Padding);
2335 28592 : }
2336 263411 :
2337 237549 : static void emitGlobalConstantArray(const DataLayout &DL,
2338 326614 : const ConstantArray *CA, AsmPrinter &AP,
2339 163307 : const Constant *BaseCV, uint64_t Offset) {
2340 237549 : // See if we can aggregate some values. Make sure it can be
2341 237549 : // represented as a series of bytes of the constant value.
2342 : int Value = isRepeatedByteSequence(CA, DL);
2343 :
2344 2730 : if (Value != -1) {
2345 13355 : uint64_t Bytes = DL.getTypeAllocSize(CA->getType());
2346 21250 : AP.OutStreamer->emitFill(Bytes, Value);
2347 : }
2348 : else {
2349 28592 : for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) {
2350 28592 : emitGlobalConstantImpl(DL, CA->getOperand(i), AP, BaseCV, Offset);
2351 28592 : Offset += DL.getTypeAllocSize(CA->getOperand(i)->getType());
2352 : }
2353 28592 : }
2354 7 : }
2355 :
2356 : static void emitGlobalConstantVector(const DataLayout &DL,
2357 40997 : const ConstantVector *CV, AsmPrinter &AP) {
2358 : for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i)
2359 : emitGlobalConstantImpl(DL, CV->getOperand(i), AP);
2360 :
2361 : unsigned Size = DL.getTypeAllocSize(CV->getType());
2362 40997 : unsigned EmittedSize = DL.getTypeAllocSize(CV->getType()->getElementType()) *
2363 : CV->getType()->getNumElements();
2364 40997 : if (unsigned Padding = Size - EmittedSize)
2365 3 : AP.OutStreamer->EmitZeros(Padding);
2366 3 : }
2367 :
2368 : static void emitGlobalConstantStruct(const DataLayout &DL,
2369 264535 : const ConstantStruct *CS, AsmPrinter &AP,
2370 223541 : const Constant *BaseCV, uint64_t Offset) {
2371 223541 : // Print the fields in successive locations. Pad to align if needed!
2372 : unsigned Size = DL.getTypeAllocSize(CS->getType());
2373 : const StructLayout *Layout = DL.getStructLayout(CS->getType());
2374 40997 : uint64_t SizeSoFar = 0;
2375 : for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) {
2376 1644 : const Constant *Field = CS->getOperand(i);
2377 :
2378 25503 : // Print the actual field value.
2379 23859 : emitGlobalConstantImpl(DL, Field, AP, BaseCV, Offset + SizeSoFar);
2380 :
2381 1644 : // Check if padding is needed and insert one or more 0s.
2382 1644 : uint64_t FieldSize = DL.getTypeAllocSize(Field->getType());
2383 1644 : uint64_t PadSize = ((i == e-1 ? Size : Layout->getElementOffset(i+1))
2384 1644 : - Layout->getElementOffset(i)) - FieldSize;
2385 0 : SizeSoFar += FieldSize + PadSize;
2386 1644 :
2387 : // Insert padding - this may include padding to increase the size of the
2388 71490 : // current field up to the ABI size (if the struct is not packed) as well
2389 : // as padding to ensure that the next field starts at the right offset.
2390 : AP.OutStreamer->EmitZeros(PadSize);
2391 : }
2392 71490 : assert(SizeSoFar == Layout->getSizeInBytes() &&
2393 71490 : "Layout of constant struct may be incorrect!");
2394 : }
2395 292791 :
2396 221301 : static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP) {
2397 : APInt API = APF.bitcastToAPInt();
2398 :
2399 221301 : // First print a comment with what we think the original floating-point value
2400 : // should have been.
2401 : if (AP.isVerbose()) {
2402 221301 : SmallString<8> StrVal;
2403 221301 : APF.toString(StrVal);
2404 221301 :
2405 221301 : if (ET)
2406 : ET->print(AP.OutStreamer->GetCommentOS());
2407 : else
2408 : AP.OutStreamer->GetCommentOS() << "Printing <null> Type";
2409 : AP.OutStreamer->GetCommentOS() << ' ' << StrVal << '\n';
2410 221301 : }
2411 :
2412 : // Now iterate through the APInt chunks, emitting them in endian-correct
2413 : // order, possibly with a smaller chunk at beginning/end (e.g. for x87 80-bit
2414 71490 : // floats).
2415 : unsigned NumBytes = API.getBitWidth() / 8;
2416 31001 : unsigned TrailingBytes = NumBytes % sizeof(uint64_t);
2417 31001 : const uint64_t *p = API.getRawData();
2418 :
2419 : // PPC's long double has odd notions of endianness compared to how LLVM
2420 : // handles it: p[0] goes first for *big* endian on PPC.
2421 31001 : if (AP.getDataLayout().isBigEndian() && !ET->isPPC_FP128Ty()) {
2422 : int Chunk = API.getNumWords() - 1;
2423 13328 :
2424 : if (TrailingBytes)
2425 13328 : AP.OutStreamer->EmitIntValue(p[Chunk--], TrailingBytes);
2426 13328 :
2427 : for (; Chunk >= 0; --Chunk)
2428 0 : AP.OutStreamer->EmitIntValue(p[Chunk], sizeof(uint64_t));
2429 13328 : } else {
2430 : unsigned Chunk;
2431 : for (Chunk = 0; Chunk < NumBytes / sizeof(uint64_t); ++Chunk)
2432 : AP.OutStreamer->EmitIntValue(p[Chunk], sizeof(uint64_t));
2433 :
2434 : if (TrailingBytes)
2435 31001 : AP.OutStreamer->EmitIntValue(p[Chunk], TrailingBytes);
2436 31001 : }
2437 :
2438 : // Emit the tail padding for the long double.
2439 : const DataLayout &DL = AP.getDataLayout();
2440 : AP.OutStreamer->EmitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET));
2441 31001 : }
2442 1550 :
2443 : static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) {
2444 1550 : emitGlobalConstantFP(CFP->getValueAPF(), CFP->getType(), AP);
2445 1017 : }
2446 :
2447 2102 : static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP) {
2448 552 : const DataLayout &DL = AP.getDataLayout();
2449 : unsigned BitWidth = CI->getBitWidth();
2450 :
2451 46945 : // Copy the value as we may massage the layout for constants whose bit width
2452 17494 : // is not a multiple of 64-bits.
2453 : APInt Realigned(CI->getValue());
2454 29451 : uint64_t ExtraBits = 0;
2455 12284 : unsigned ExtraBitsSize = BitWidth & 63;
2456 :
2457 : if (ExtraBitsSize) {
2458 : // The bit width of the data is not a multiple of 64-bits.
2459 31001 : // The extra bits are expected to be at the end of the chunk of the memory.
2460 62002 : // Little endian:
2461 31001 : // * Nothing to be done, just record the extra bits to emit.
2462 : // Big endian:
2463 20376 : // * Record the extra bits to emit.
2464 20376 : // * Realign the raw data to emit the chunks of 64-bits.
2465 20376 : if (DL.isBigEndian()) {
2466 : // Basically the structure of the raw data is a chunk of 64-bits cells:
2467 41 : // 0 1 BitWidth / 64
2468 41 : // [chunk1][chunk2] ... [chunkN].
2469 : // The most significant chunk is chunkN and it should be emitted first.
2470 : // However, due to the alignment issue chunkN contains useless bits.
2471 : // Realign the chunks so that they contain only useless information:
2472 : // ExtraBits 0 1 (BitWidth / 64) - 1
2473 : // chu[nk1 chu][nk2 chu] ... [nkN-1 chunkN]
2474 : ExtraBits = Realigned.getRawData()[0] &
2475 41 : (((uint64_t)-1) >> (64 - ExtraBitsSize));
2476 : Realigned.lshrInPlace(ExtraBitsSize);
2477 41 : } else
2478 : ExtraBits = Realigned.getRawData()[BitWidth / 64];
2479 : }
2480 :
2481 : // We don't expect assemblers to support integer data directives
2482 : // for more than 64 bits, so we emit the data in at most 64-bit
2483 : // quantities at a time.
2484 : const uint64_t *RawData = Realigned.getRawData();
2485 4 : for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
2486 : uint64_t Val = DL.isBigEndian() ? RawData[e - i - 1] : RawData[i];
2487 : AP.OutStreamer->EmitIntValue(Val, 8);
2488 : }
2489 :
2490 : if (ExtraBitsSize) {
2491 : // Emit the extra bits after the 64-bits chunks.
2492 :
2493 : // Emit a directive that fills the expected size.
2494 2 : uint64_t Size = AP.getDataLayout().getTypeAllocSize(CI->getType());
2495 1 : Size -= (BitWidth / 64) * 8;
2496 : assert(Size && Size * 8 >= ExtraBitsSize &&
2497 : (ExtraBits & (((uint64_t)-1) >> (64 - ExtraBitsSize)))
2498 3 : == ExtraBits && "Directive too small for extra bits.");
2499 : AP.OutStreamer->EmitIntValue(ExtraBits, Size);
2500 : }
2501 : }
2502 :
2503 : /// Transform a not absolute MCExpr containing a reference to a GOT
2504 : /// equivalent global, by a target specific GOT pc relative access to the
2505 153 : /// final symbol.
2506 112 : static void handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME,
2507 112 : const Constant *BaseCst,
2508 : uint64_t Offset) {
2509 : // The global @foo below illustrates a global that uses a got equivalent.
2510 41 : //
2511 : // @bar = global i32 42
2512 : // @gotequiv = private unnamed_addr constant i32* @bar
2513 : // @foo = i32 trunc (i64 sub (i64 ptrtoint (i32** @gotequiv to i64),
2514 4 : // i64 ptrtoint (i32* @foo to i64))
2515 4 : // to i32)
2516 : //
2517 : // The cstexpr in @foo is converted into the MCExpr `ME`, where we actually
2518 : // check whether @foo is suitable to use a GOTPCREL. `ME` is usually in the
2519 4 : // form:
2520 : //
2521 41 : // foo = cstexpr, where
2522 : // cstexpr := <gotequiv> - "." + <cst>
2523 : // cstexpr := <gotequiv> - (<foo> - <offset from @foo base>) + <cst>
2524 : //
2525 : // After canonicalization by evaluateAsRelocatable `ME` turns into:
2526 482 : //
2527 : // cstexpr := <gotequiv> - <foo> + gotpcrelcst, where
2528 : // gotpcrelcst := <offset from @foo base> + <cst>
2529 : MCValue MV;
2530 : if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr) || MV.isAbsolute())
2531 : return;
2532 : const MCSymbolRefExpr *SymA = MV.getSymA();
2533 : if (!SymA)
2534 : return;
2535 :
2536 : // Check that GOT equivalent symbol is cached.
2537 : const MCSymbol *GOTEquivSym = &SymA->getSymbol();
2538 : if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
2539 : return;
2540 :
2541 : const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
2542 : if (!BaseGV)
2543 : return;
2544 :
2545 : // Check for a valid base symbol
2546 : const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
2547 : const MCSymbolRefExpr *SymB = MV.getSymB();
2548 :
2549 482 : if (!SymB || BaseSym != &SymB->getSymbol())
2550 482 : return;
2551 464 :
2552 : // Make sure to match:
2553 482 : //
2554 : // gotpcrelcst := <offset from @foo base> + <cst>
2555 : //
2556 : // If gotpcrelcst is positive it means that we can safely fold the pc rel
2557 482 : // displacement into the GOTPCREL. We can also can have an extra offset <cst>
2558 : // if the target knows how to encode it.
2559 461 : int64_t GOTPCRelCst = Offset + MV.getConstant();
2560 : if (GOTPCRelCst < 0)
2561 : return;
2562 : if (!AP.getObjFileLowering().supportGOTPCRelWithOffset() && GOTPCRelCst != 0)
2563 : return;
2564 :
2565 : // Emit the GOT PC relative to replace the got equivalent global, i.e.:
2566 20 : //
2567 20 : // bar:
2568 : // .long 42
2569 20 : // gotequiv:
2570 : // .quad bar
2571 : // foo:
2572 : // .long gotequiv - "." + <cst>
2573 : //
2574 : // is replaced by the target specific equivalent to:
2575 : //
2576 : // bar:
2577 : // .long 42
2578 : // foo:
2579 20 : // .long bar@GOTPCREL+<gotpcrelcst>
2580 20 : AsmPrinter::GOTEquivUsePair Result = AP.GlobalGOTEquivs[GOTEquivSym];
2581 : const GlobalVariable *GV = Result.first;
2582 20 : int NumUses = (int)Result.second;
2583 : const GlobalValue *FinalGV = dyn_cast<GlobalValue>(GV->getOperand(0));
2584 : const MCSymbol *FinalSym = AP.getSymbol(FinalGV);
2585 : *ME = AP.getObjFileLowering().getIndirectSymViaGOTPCRel(
2586 : FinalSym, MV, Offset, AP.MMI, *AP.OutStreamer);
2587 :
2588 : // Update GOT equivalent usage information
2589 : --NumUses;
2590 : if (NumUses >= 0)
2591 : AP.GlobalGOTEquivs[GOTEquivSym] = std::make_pair(GV, NumUses);
2592 : }
2593 :
2594 : static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *CV,
2595 : AsmPrinter &AP, const Constant *BaseCV,
2596 : uint64_t Offset) {
2597 : uint64_t Size = DL.getTypeAllocSize(CV->getType());
2598 :
2599 : // Globals with sub-elements such as combinations of arrays and structs
2600 18 : // are handled recursively by emitGlobalConstantImpl. Keep track of the
2601 : // constant symbol base and the current position with BaseCV and Offset.
2602 18 : if (!BaseCV && CV->hasOneUse())
2603 : BaseCV = dyn_cast<Constant>(CV->user_back());
2604 18 :
2605 18 : if (isa<ConstantAggregateZero>(CV) || isa<UndefValue>(CV))
2606 18 : return AP.OutStreamer->EmitZeros(Size);
2607 :
2608 : if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
2609 18 : switch (Size) {
2610 18 : case 1:
2611 18 : case 2:
2612 : case 4:
2613 : case 8:
2614 836202 : if (AP.isVerbose())
2615 : AP.OutStreamer->GetCommentOS() << format("0x%" PRIx64 "\n",
2616 : CI->getZExtValue());
2617 836202 : AP.OutStreamer->EmitIntValue(CI->getZExtValue(), Size);
2618 : return;
2619 : default:
2620 : emitGlobalConstantLargeInt(CI, AP);
2621 : return;
2622 1212402 : }
2623 : }
2624 :
2625 836202 : if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV))
2626 636644 : return emitGlobalConstantFP(CFP, AP);
2627 :
2628 : if (isa<ConstantPointerNull>(CV)) {
2629 : AP.OutStreamer->EmitIntValue(0, Size);
2630 156529 : return;
2631 : }
2632 :
2633 : if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(CV))
2634 156529 : return emitGlobalConstantDataSequential(DL, CDS, AP);
2635 31846 :
2636 15923 : if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
2637 313058 : return emitGlobalConstantArray(DL, CVA, AP, BaseCV, Offset);
2638 156529 :
2639 41 : if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV))
2640 41 : return emitGlobalConstantStruct(DL, CVS, AP, BaseCV, Offset);
2641 41 :
2642 : if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
2643 : // Look through bitcasts, which might not be able to be MCExpr'ized (e.g. of
2644 : // vectors).
2645 : if (CE->getOpcode() == Instruction::BitCast)
2646 20376 : return emitGlobalConstantImpl(DL, CE->getOperand(0), AP);
2647 :
2648 617347 : if (Size > 8) {
2649 12014 : // If the constant expression's size is greater than 64-bits, then we have
2650 12014 : // to emit the value in chunks. Try to constant fold the value and emit it
2651 : // that way.
2652 : Constant *New = ConstantFoldConstant(CE, DL);
2653 : if (New && New != CE)
2654 223823 : return emitGlobalConstantImpl(DL, New, AP);
2655 : }
2656 : }
2657 40997 :
2658 : if (const ConstantVector *V = dyn_cast<ConstantVector>(CV))
2659 : return emitGlobalConstantVector(DL, V, AP);
2660 71490 :
2661 : // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
2662 : // thread the streamer with EmitValue.
2663 : const MCExpr *ME = AP.lowerConstant(CV);
2664 :
2665 210559 : // Since lowerConstant already folded and got rid of all IR pointer and
2666 67820 : // integer casts, detect GOT equivalent accesses by looking into the MCExpr
2667 : // directly.
2668 142739 : if (AP.getObjFileLowering().supportIndirectSymViaGOTPCRel())
2669 : handleIndirectSymViaGOTPCRel(AP, &ME, BaseCV, Offset);
2670 :
2671 : AP.OutStreamer->EmitValue(ME, Size);
2672 1 : }
2673 1 :
2674 1 : /// EmitGlobalConstant - Print a general LLVM constant to the .s file.
2675 : void AsmPrinter::EmitGlobalConstant(const DataLayout &DL, const Constant *CV) {
2676 : uint64_t Size = DL.getTypeAllocSize(CV->getType());
2677 : if (Size)
2678 : emitGlobalConstantImpl(DL, CV, *this);
2679 1644 : else if (MAI->hasSubsectionsViaSymbols()) {
2680 : // If the global has zero size, emit a single byte so that two labels don't
2681 : // look like they are at the same location.
2682 : OutStreamer->EmitIntValue(0, 1);
2683 199558 : }
2684 : }
2685 :
2686 : void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
2687 : // Target doesn't support this yet!
2688 199556 : llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
2689 482 : }
2690 :
2691 199556 : void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const {
2692 : if (Offset > 0)
2693 : OS << '+' << Offset;
2694 : else if (Offset < 0)
2695 299726 : OS << Offset;
2696 299726 : }
2697 299726 :
2698 299680 : //===----------------------------------------------------------------------===//
2699 46 : // Symbol Lowering Routines.
2700 : //===----------------------------------------------------------------------===//
2701 :
2702 1 : MCSymbol *AsmPrinter::createTempSymbol(const Twine &Name) const {
2703 : return OutContext.createTempSymbol(Name, true);
2704 299724 : }
2705 :
2706 0 : MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const {
2707 : return MMI->getAddrLabelSymbol(BA->getBasicBlock());
2708 0 : }
2709 :
2710 : MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const {
2711 94 : return MMI->getAddrLabelSymbol(BB);
2712 94 : }
2713 7 :
2714 87 : /// GetCPISymbol - Return the symbol for the specified constant pool entry.
2715 0 : MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const {
2716 94 : if (getSubtargetInfo().getTargetTriple().isKnownWindowsMSVCEnvironment()) {
2717 : const MachineConstantPoolEntry &CPE =
2718 : MF->getConstantPool()->getConstants()[CPID];
2719 : if (!CPE.isMachineConstantPoolEntry()) {
2720 : const DataLayout &DL = MF->getDataLayout();
2721 : SectionKind Kind = CPE.getSectionKind(&DL);
2722 891925 : const Constant *C = CPE.Val.ConstVal;
2723 891925 : unsigned Align = CPE.Alignment;
2724 : if (const MCSectionCOFF *S = dyn_cast<MCSectionCOFF>(
2725 : getObjFileLowering().getSectionForConstant(DL, Kind, C, Align))) {
2726 522 : if (MCSymbol *Sym = S->getCOMDATSymbol()) {
2727 522 : if (Sym->isUndefined())
2728 : OutStreamer->EmitSymbolAttribute(Sym, MCSA_Global);
2729 : return Sym;
2730 616 : }
2731 616 : }
2732 : }
2733 : }
2734 :
2735 72639 : const DataLayout &DL = getDataLayout();
2736 72639 : return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
2737 : "CPI" + Twine(getFunctionNumber()) + "_" +
2738 165 : Twine(CPID));
2739 330 : }
2740 165 :
2741 165 : /// GetJTISymbol - Return the symbol for the specified jump table entry.
2742 165 : MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const {
2743 165 : return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
2744 165 : }
2745 165 :
2746 165 : /// GetJTSetSymbol - Return the symbol for the specified jump table .set
2747 163 : /// FIXME: privatize to AsmPrinter.
2748 62 : MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const {
2749 163 : const DataLayout &DL = getDataLayout();
2750 : return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
2751 : Twine(getFunctionNumber()) + "_" +
2752 : Twine(UID) + "_set_" + Twine(MBBID));
2753 : }
2754 :
2755 72476 : MCSymbol *AsmPrinter::getSymbolWithGlobalValueBase(const GlobalValue *GV,
2756 144952 : StringRef Suffix) const {
2757 72476 : return getObjFileLowering().getSymbolWithGlobalValueBase(GV, Suffix, TM);
2758 72476 : }
2759 :
2760 : /// Return the MCSymbol for the specified ExternalSymbol.
2761 : MCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const {
2762 6421 : SmallString<60> NameStr;
2763 6421 : Mangler::getNameWithPrefix(NameStr, Sym, getDataLayout());
2764 : return OutContext.getOrCreateSymbol(NameStr);
2765 : }
2766 :
2767 : /// PrintParentLoopComment - Print comments about parent loops of this one.
2768 869 : static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop,
2769 869 : unsigned FunctionNumber) {
2770 1738 : if (!Loop) return;
2771 869 : PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber);
2772 1738 : OS.indent(Loop->getLoopDepth()*2)
2773 : << "Parent Loop BB" << FunctionNumber << "_"
2774 : << Loop->getHeader()->getNumber()
2775 920 : << " Depth=" << Loop->getLoopDepth() << '\n';
2776 : }
2777 920 :
2778 : /// PrintChildLoopComment - Print comments about child loops within
2779 : /// the loop for this basic block, with nesting.
2780 : static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop,
2781 13527 : unsigned FunctionNumber) {
2782 : // Add child loop information
2783 13527 : for (const MachineLoop *CL : *Loop) {
2784 27054 : OS.indent(CL->getLoopDepth()*2)
2785 : << "Child Loop BB" << FunctionNumber << "_"
2786 : << CL->getHeader()->getNumber() << " Depth " << CL->getLoopDepth()
2787 : << '\n';
2788 5824 : PrintChildLoopComment(OS, CL, FunctionNumber);
2789 : }
2790 5824 : }
2791 352 :
2792 704 : /// emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
2793 704 : static void emitBasicBlockLoopComments(const MachineBasicBlock &MBB,
2794 352 : const MachineLoopInfo *LI,
2795 352 : const AsmPrinter &AP) {
2796 : // Add loop depth information
2797 : const MachineLoop *Loop = LI->getLoopFor(&MBB);
2798 : if (!Loop) return;
2799 :
2800 5824 : MachineBasicBlock *Header = Loop->getHeader();
2801 : assert(Header && "No header for loop");
2802 :
2803 6176 : // If this block is not a loop header, just print out what is the loop header
2804 704 : // and return.
2805 704 : if (Header != &MBB) {
2806 352 : AP.OutStreamer->AddComment(" in Loop: Header=BB" +
2807 : Twine(AP.getFunctionNumber())+"_" +
2808 352 : Twine(Loop->getHeader()->getNumber())+
2809 : " Depth="+Twine(Loop->getLoopDepth()));
2810 5824 : return;
2811 : }
2812 :
2813 227057 : // Otherwise, it is a loop header. Print out information about child and
2814 : // parent loops.
2815 : raw_ostream &OS = AP.OutStreamer->GetCommentOS();
2816 :
2817 : PrintParentLoopComment(OS, Loop->getParentLoop(), AP.getFunctionNumber());
2818 227057 :
2819 : OS << "=>";
2820 : OS.indent(Loop->getLoopDepth()*2-2);
2821 :
2822 : OS << "This ";
2823 : if (Loop->empty())
2824 : OS << "Inner ";
2825 8368 : OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n';
2826 2896 :
2827 2896 : PrintChildLoopComment(OS, Loop, AP.getFunctionNumber());
2828 2896 : }
2829 2896 :
2830 2896 : void AsmPrinter::setupCodePaddingContext(const MachineBasicBlock &MBB,
2831 : MCCodePaddingContext &Context) const {
2832 : assert(MF != nullptr && "Machine function must be valid");
2833 : Context.IsPaddingActive = !MF->hasInlineAsm() &&
2834 : !MF->getFunction().optForSize() &&
2835 5472 : TM.getOptLevel() != CodeGenOpt::None;
2836 : Context.IsBasicBlockReachableViaFallthrough =
2837 5472 : std::find(MBB.pred_begin(), MBB.pred_end(), MBB.getPrevNode()) !=
2838 : MBB.pred_end();
2839 5472 : Context.IsBasicBlockReachableViaBranch =
2840 10944 : MBB.pred_size() > 0 && !isBlockOnlyReachableByFallthrough(&MBB);
2841 : }
2842 5472 :
2843 5472 : /// EmitBasicBlockStart - This method prints the label for the specified
2844 5233 : /// MachineBasicBlock, an alignment (if present) and a comment describing
2845 5472 : /// it if appropriate.
2846 : void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) const {
2847 5472 : // End the previous funclet and start a new one.
2848 : if (MBB.isEHFuncletEntry()) {
2849 : for (const HandlerInfo &HI : Handlers) {
2850 6562518 : HI.Handler->endFunclet();
2851 : HI.Handler->beginFunclet(MBB);
2852 : }
2853 13081186 : }
2854 13081186 :
2855 6518668 : // Emit an alignment directive for this block, if needed.
2856 6562518 : if (unsigned Align = MBB.getAlignment())
2857 13125036 : EmitAlignment(Align);
2858 : MCCodePaddingContext Context;
2859 6562518 : setupCodePaddingContext(MBB, Context);
2860 6562518 : OutStreamer->EmitCodePaddingBasicBlockStart(Context);
2861 6562518 :
2862 : // If the block has its address taken, emit any labels that were used to
2863 : // reference the block. It is possible that there is more than one label
2864 : // here, because multiple LLVM BB's may have been RAUW'd to this block after
2865 : // the references were generated.
2866 3281259 : if (MBB.hasAddressTaken()) {
2867 : const BasicBlock *BB = MBB.getBasicBlock();
2868 3281259 : if (isVerbose())
2869 353 : OutStreamer->AddComment("Block address taken");
2870 235 :
2871 235 : // MBBs can have their address taken as part of CodeGen without having
2872 : // their corresponding BB's address taken in IR
2873 : if (BB->hasAddressTaken())
2874 : for (MCSymbol *Sym : MMI->getAddrLabelSymbolToEmit(BB))
2875 : OutStreamer->EmitLabel(Sym);
2876 3281259 : }
2877 10118 :
2878 : // Print some verbose block comments.
2879 3281259 : if (isVerbose()) {
2880 3281259 : if (const BasicBlock *BB = MBB.getBasicBlock()) {
2881 : if (BB->hasName()) {
2882 : BB->printAsOperand(OutStreamer->GetCommentOS(),
2883 : /*PrintType=*/false, BB->getModule());
2884 : OutStreamer->GetCommentOS() << '\n';
2885 : }
2886 3281259 : }
2887 589 :
2888 589 : assert(MLI != nullptr && "MachineLoopInfo should has been computed");
2889 980 : emitBasicBlockLoopComments(MBB, MLI, *this);
2890 : }
2891 :
2892 : // Print the main label for the block.
2893 589 : if (MBB.pred_empty() ||
2894 978 : (isBlockOnlyReachableByFallthrough(&MBB) && !MBB.isEHFuncletEntry())) {
2895 489 : if (isVerbose()) {
2896 : // NOTE: Want this comment at start of line, don't emit with AddComment.
2897 : OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":",
2898 : false);
2899 3281259 : }
2900 227057 : } else {
2901 222833 : OutStreamer->EmitLabel(MBB.getSymbol());
2902 85708 : }
2903 : }
2904 85708 :
2905 : void AsmPrinter::EmitBasicBlockEnd(const MachineBasicBlock &MBB) {
2906 : MCCodePaddingContext Context;
2907 : setupCodePaddingContext(MBB, Context);
2908 : OutStreamer->EmitCodePaddingBasicBlockEnd(Context);
2909 227057 : }
2910 :
2911 : void AsmPrinter::EmitVisibility(MCSymbol *Sym, unsigned Visibility,
2912 : bool IsDefinition) const {
2913 6154273 : MCSymbolAttr Attr = MCSA_Invalid;
2914 3579843 :
2915 1115074 : switch (Visibility) {
2916 : default: break;
2917 409036 : case GlobalValue::HiddenVisibility:
2918 204518 : if (IsDefinition)
2919 : Attr = MAI->getHiddenVisibilityAttr();
2920 : else
2921 2166185 : Attr = MAI->getHiddenDeclarationVisibilityAttr();
2922 : break;
2923 3281259 : case GlobalValue::ProtectedVisibility:
2924 : Attr = MAI->getProtectedVisibilityAttr();
2925 3281259 : break;
2926 : }
2927 3281259 :
2928 3281259 : if (Attr != MCSA_Invalid)
2929 3281259 : OutStreamer->EmitSymbolAttribute(Sym, Attr);
2930 : }
2931 697286 :
2932 : /// isBlockOnlyReachableByFallthough - Return true if the basic block has
2933 : /// exactly one predecessor and the control transfer mechanism between
2934 : /// the predecessor and this block is a fall-through.
2935 697286 : bool AsmPrinter::
2936 : isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
2937 10261 : // If this is a landing pad, it isn't a fall through. If it has no preds,
2938 10261 : // then nothing falls through to it.
2939 9650 : if (MBB->isEHPad() || MBB->pred_empty())
2940 : return false;
2941 611 :
2942 : // If there isn't exactly one predecessor, it can't be a fall through.
2943 58 : if (MBB->pred_size() > 1)
2944 58 : return false;
2945 58 :
2946 : // The predecessor has to be immediately before this block.
2947 : MachineBasicBlock *Pred = *MBB->pred_begin();
2948 10319 : if (!Pred->isLayoutSuccessor(MBB))
2949 10217 : return false;
2950 697286 :
2951 : // If the block is completely empty, then it definitely does fall through.
2952 : if (Pred->empty())
2953 : return true;
2954 :
2955 8609441 : // Check the terminators in the previous blocks
2956 : for (const auto &MI : Pred->terminators()) {
2957 : // If it is not a simple branch, we are in a table somewhere.
2958 : if (!MI.isBranch() || MI.isIndirectBranch())
2959 8609441 : return false;
2960 :
2961 : // If we are the operands of one of the branches, this is not a fall
2962 : // through. Note that targets with delay slots will usually bundle
2963 7594722 : // terminators with the delay slot instruction.
2964 : for (ConstMIBundleOperands OP(MI); OP.isValid(); ++OP) {
2965 : if (OP->isJTI())
2966 : return false;
2967 5838126 : if (OP->isMBB() && OP->getMBB() == MBB)
2968 5838126 : return false;
2969 : }
2970 : }
2971 :
2972 4011609 : return true;
2973 : }
2974 :
2975 : GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy &S) {
2976 5576268 : if (!S.usesMetadata())
2977 : return nullptr;
2978 6916380 :
2979 10203 : assert(!S.useStatepoints() && "statepoints do not currently support custom"
2980 : " stackmap formats, please see the documentation for a description of"
2981 : " the default format. If you really need a custom serialized format,"
2982 : " please file a bug");
2983 :
2984 6619629 : gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
2985 5054244 : gcp_map_type::iterator GCPI = GCMap.find(&S);
2986 1884579 : if (GCPI != GCMap.end())
2987 5054244 : return GCPI->second.get();
2988 :
2989 : auto Name = S.getName();
2990 :
2991 : for (GCMetadataPrinterRegistry::iterator
2992 : I = GCMetadataPrinterRegistry::begin(),
2993 : E = GCMetadataPrinterRegistry::end(); I != E; ++I)
2994 : if (Name == I->getName()) {
2995 50 : std::unique_ptr<GCMetadataPrinter> GMP = I->instantiate();
2996 50 : GMP->S = &S;
2997 : auto IterBool = GCMap.insert(std::make_pair(&S, std::move(GMP)));
2998 : return IterBool.first->second.get();
2999 : }
3000 :
3001 : report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
3002 : }
3003 :
3004 12 : /// Pin vtable to this file.
3005 12 : AsmPrinterHandler::~AsmPrinterHandler() = default;
3006 12 :
3007 6 : void AsmPrinterHandler::markFunctionEnd() {}
3008 :
3009 : // In the binary's "xray_instr_map" section, an array of these function entries
3010 : // describes each instrumentation point. When XRay patches your code, the index
3011 : // into this table will be given to your handler as a patch point identifier.
3012 6 : void AsmPrinter::XRayFunctionEntry::emit(int Bytes, MCStreamer *Out,
3013 9 : const MCSymbol *CurrentFnSym) const {
3014 : Out->EmitSymbolValue(Sled, Bytes);
3015 6 : Out->EmitSymbolValue(CurrentFnSym, Bytes);
3016 6 : auto Kind8 = static_cast<uint8_t>(Kind);
3017 6 : Out->EmitBinaryData(StringRef(reinterpret_cast<const char *>(&Kind8), 1));
3018 6 : Out->EmitBinaryData(
3019 : StringRef(reinterpret_cast<const char *>(&AlwaysInstrument), 1));
3020 : Out->EmitBinaryData(StringRef(reinterpret_cast<const char *>(&Version), 1));
3021 0 : auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
3022 : assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
3023 : Out->EmitZeros(Padding);
3024 : }
3025 :
3026 : void AsmPrinter::emitXRayTable() {
3027 407904 : if (Sleds.empty())
3028 : return;
3029 :
3030 : auto PrevSection = OutStreamer->getCurrentSectionOnly();
3031 : const Function &F = MF->getFunction();
3032 152 : MCSection *InstMap = nullptr;
3033 : MCSection *FnSledIndex = nullptr;
3034 152 : if (MF->getSubtarget().getTargetTriple().isOSBinFormatELF()) {
3035 152 : auto Associated = dyn_cast<MCSymbolELF>(CurrentFnSym);
3036 152 : assert(Associated != nullptr);
3037 304 : auto Flags = ELF::SHF_WRITE | ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER;
3038 152 : std::string GroupName;
3039 152 : if (F.hasComdat()) {
3040 304 : Flags |= ELF::SHF_GROUP;
3041 152 : GroupName = F.getComdat()->getName();
3042 : }
3043 152 :
3044 152 : auto UniqueID = ++XRayFnUniqueID;
3045 : InstMap =
3046 365489 : OutContext.getELFSection("xray_instr_map", ELF::SHT_PROGBITS, Flags, 0,
3047 365489 : GroupName, UniqueID, Associated);
3048 : FnSledIndex =
3049 : OutContext.getELFSection("xray_fn_idx", ELF::SHT_PROGBITS, Flags, 0,
3050 : GroupName, UniqueID, Associated);
3051 70 : } else if (MF->getSubtarget().getTargetTriple().isOSBinFormatMachO()) {
3052 : InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map", 0,
3053 : SectionKind::getReadOnlyWithRel());
3054 140 : FnSledIndex = OutContext.getMachOSection("__DATA", "xray_fn_idx", 0,
3055 58 : SectionKind::getReadOnlyWithRel());
3056 : } else {
3057 : llvm_unreachable("Unsupported target");
3058 : }
3059 58 :
3060 : auto WordSizeBytes = MAI->getCodePointerSize();
3061 30 :
3062 : // Now we switch to the instrumentation map section. Because this is done
3063 : // per-function, we are able to create an index entry that will represent the
3064 58 : // range of sleds associated with a function.
3065 : MCSymbol *SledsStart = OutContext.createTempSymbol("xray_sleds_start", true);
3066 116 : OutStreamer->SwitchSection(InstMap);
3067 : OutStreamer->EmitLabel(SledsStart);
3068 : for (const auto &Sled : Sleds)
3069 116 : Sled.emit(WordSizeBytes, OutStreamer.get(), CurrentFnSym);
3070 : MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_sleds_end", true);
3071 12 : OutStreamer->EmitLabel(SledsEnd);
3072 12 :
3073 : // We then emit a single entry in the index per function. We use the symbols
3074 12 : // that bound the instrumentation map as the range for a specific function.
3075 : // Each entry here will be 2 * word size aligned, as we're writing down two
3076 : // pointers. This should work for both 32-bit and 64-bit platforms.
3077 0 : OutStreamer->SwitchSection(FnSledIndex);
3078 : OutStreamer->EmitCodeAlignment(2 * WordSizeBytes);
3079 : OutStreamer->EmitSymbolValue(SledsStart, WordSizeBytes, false);
3080 70 : OutStreamer->EmitSymbolValue(SledsEnd, WordSizeBytes, false);
3081 : OutStreamer->SwitchSection(PrevSection);
3082 : Sleds.clear();
3083 : }
3084 :
3085 140 : void AsmPrinter::recordSled(MCSymbol *Sled, const MachineInstr &MI,
3086 70 : SledKind Kind, uint8_t Version) {
3087 70 : const Function &F = MI.getMF()->getFunction();
3088 222 : auto Attr = F.getFnAttribute("function-instrument");
3089 304 : bool LogArgs = F.hasFnAttribute("xray-log-args");
3090 140 : bool AlwaysInstrument =
3091 70 : Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
3092 : if (Kind == SledKind::FUNCTION_ENTER && LogArgs)
3093 : Kind = SledKind::LOG_ARGS_ENTER;
3094 : Sleds.emplace_back(XRayFunctionEntry{Sled, CurrentFnSym, Kind,
3095 : AlwaysInstrument, &F, Version});
3096 : }
3097 70 :
3098 70 : uint16_t AsmPrinter::getDwarfVersion() const {
3099 70 : return OutStreamer->getContext().getDwarfVersion();
3100 70 : }
3101 70 :
3102 : void AsmPrinter::setDwarfVersion(uint16_t Version) {
3103 : OutStreamer->getContext().setDwarfVersion(Version);
3104 : }
|