1//===- lib/MC/MCSection.cpp - Machine Code Section Representation ---------===// 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#include "llvm/MC/MCSection.h" 11#include "llvm/MC/MCAssembler.h" 12#include "llvm/MC/MCAsmInfo.h" 13#include "llvm/MC/MCContext.h" 14#include "llvm/MC/MCSymbol.h" 15#include "llvm/Support/raw_ostream.h" 16using namespace llvm; 17 18//===----------------------------------------------------------------------===// 19// MCSection 20//===----------------------------------------------------------------------===// 21 22MCSection::MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin) 23 : Begin(Begin), BundleGroupBeforeFirstInst(false), HasInstructions(false), 24 IsRegistered(false), DummyFragment(this), Variant(V), Kind(K) {} 25 26MCSymbol *MCSection::getEndSymbol(MCContext &Ctx) { 27 if (!End) 28 End = Ctx.createTempSymbol("sec_end", true); 29 return End; 30} 31 32bool MCSection::hasEnded() const { return End && End->isInSection(); } 33 34MCSection::~MCSection() { 35} 36 37void MCSection::setBundleLockState(BundleLockStateType NewState) { 38 if (NewState == NotBundleLocked) { 39 if (BundleLockNestingDepth == 0) { 40 report_fatal_error("Mismatched bundle_lock/unlock directives"); 41 } 42 if (--BundleLockNestingDepth == 0) { 43 BundleLockState = NotBundleLocked; 44 } 45 return; 46 } 47 48 // If any of the directives is an align_to_end directive, the whole nested 49 // group is align_to_end. So don't downgrade from align_to_end to just locked. 50 if (BundleLockState != BundleLockedAlignToEnd) { 51 BundleLockState = NewState; 52 } 53 ++BundleLockNestingDepth; 54} 55 56MCSection::iterator 57MCSection::getSubsectionInsertionPoint(unsigned Subsection) { 58 if (Subsection == 0 && SubsectionFragmentMap.empty()) 59 return end(); 60 61 SmallVectorImpl<std::pair<unsigned, MCFragment *>>::iterator MI = 62 std::lower_bound(SubsectionFragmentMap.begin(), 63 SubsectionFragmentMap.end(), 64 std::make_pair(Subsection, (MCFragment *)nullptr)); 65 bool ExactMatch = false; 66 if (MI != SubsectionFragmentMap.end()) { 67 ExactMatch = MI->first == Subsection; 68 if (ExactMatch) 69 ++MI; 70 } 71 iterator IP; 72 if (MI == SubsectionFragmentMap.end()) 73 IP = end(); 74 else 75 IP = MI->second->getIterator(); 76 if (!ExactMatch && Subsection != 0) { 77 // The GNU as documentation claims that subsections have an alignment of 4, 78 // although this appears not to be the case. 79 MCFragment *F = new MCDataFragment(); 80 SubsectionFragmentMap.insert(MI, std::make_pair(Subsection, F)); 81 getFragmentList().insert(IP, F); 82 F->setParent(this); 83 } 84 85 return IP; 86} 87 88#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 89LLVM_DUMP_METHOD void MCSection::dump() { 90 raw_ostream &OS = llvm::errs(); 91 92 OS << "<MCSection"; 93 OS << " Fragments:[\n "; 94 for (auto it = begin(), ie = end(); it != ie; ++it) { 95 if (it != begin()) 96 OS << ",\n "; 97 it->dump(); 98 } 99 OS << "]>"; 100} 101#endif 102 103MCSection::iterator MCSection::begin() { return Fragments.begin(); } 104 105MCSection::iterator MCSection::end() { return Fragments.end(); } 106 107MCSection::reverse_iterator MCSection::rbegin() { return Fragments.rbegin(); } 108 109MCSection::reverse_iterator MCSection::rend() { return Fragments.rend(); } 110