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