1ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//===- lib/MC/MCSection.cpp - Machine Code Section Representation ---------===//
2ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//
3ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//                     The LLVM Compiler Infrastructure
4ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//
5ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// This file is distributed under the University of Illinois Open Source
6ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// License. See LICENSE.TXT for details.
7ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//
8ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//===----------------------------------------------------------------------===//
9ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner
10ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner#include "llvm/MC/MCSection.h"
116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCAssembler.h"
12af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h"
13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCContext.h"
144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/MC/MCSymbol.h"
15892e18239308f8a02a4c83758616be84a459c19dChris Lattner#include "llvm/Support/raw_ostream.h"
16ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattnerusing namespace llvm;
17ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner
18892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===//
19892e18239308f8a02a4c83758616be84a459c19dChris Lattner// MCSection
20892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===//
21892e18239308f8a02a4c83758616be84a459c19dChris Lattner
226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin)
236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    : Begin(Begin), BundleGroupBeforeFirstInst(false), HasInstructions(false),
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      IsRegistered(false), DummyFragment(this), Variant(V), Kind(K) {}
256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSymbol *MCSection::getEndSymbol(MCContext &Ctx) {
274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!End)
284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    End = Ctx.createTempSymbol("sec_end", true);
294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return End;
304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool MCSection::hasEnded() const { return End && End->isInSection(); }
334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
34ed47a0409b187d5dcd2bddfd054326fc809d00aeChris LattnerMCSection::~MCSection() {
35ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner}
36ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner
376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCSection::setBundleLockState(BundleLockStateType NewState) {
386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (NewState == NotBundleLocked) {
396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (BundleLockNestingDepth == 0) {
406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      report_fatal_error("Mismatched bundle_lock/unlock directives");
416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (--BundleLockNestingDepth == 0) {
436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      BundleLockState = NotBundleLocked;
446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // If any of the directives is an align_to_end directive, the whole nested
496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // group is align_to_end. So don't downgrade from align_to_end to just locked.
506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (BundleLockState != BundleLockedAlignToEnd) {
516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    BundleLockState = NewState;
526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ++BundleLockNestingDepth;
546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::iterator
576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::getSubsectionInsertionPoint(unsigned Subsection) {
586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Subsection == 0 && SubsectionFragmentMap.empty())
596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return end();
606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  SmallVectorImpl<std::pair<unsigned, MCFragment *>>::iterator MI =
626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      std::lower_bound(SubsectionFragmentMap.begin(),
636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                       SubsectionFragmentMap.end(),
646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                       std::make_pair(Subsection, (MCFragment *)nullptr));
656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool ExactMatch = false;
666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (MI != SubsectionFragmentMap.end()) {
676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ExactMatch = MI->first == Subsection;
686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (ExactMatch)
696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      ++MI;
706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  iterator IP;
726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (MI == SubsectionFragmentMap.end())
736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    IP = end();
746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    IP = MI->second->getIterator();
766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!ExactMatch && Subsection != 0) {
776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // The GNU as documentation claims that subsections have an alignment of 4,
786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // although this appears not to be the case.
796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCFragment *F = new MCDataFragment();
806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    SubsectionFragmentMap.insert(MI, std::make_pair(Subsection, F));
816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    getFragmentList().insert(IP, F);
826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    F->setParent(this);
836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return IP;
866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void MCSection::dump() {
906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  raw_ostream &OS = llvm::errs();
916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OS << "<MCSection";
936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OS << " Fragments:[\n      ";
946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (auto it = begin(), ie = end(); it != ie; ++it) {
956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (it != begin())
966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      OS << ",\n      ";
976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    it->dump();
986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OS << "]>";
1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#endif
1026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::iterator MCSection::begin() { return Fragments.begin(); }
1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::iterator MCSection::end() { return Fragments.end(); }
1066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::reverse_iterator MCSection::rbegin() { return Fragments.rbegin(); }
1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCSection::reverse_iterator MCSection::rend() { return Fragments.rend(); }
110