//===-- PIC16Section.cpp - PIC16 Section ----------- --------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "PIC16.h"
#include "PIC16ABINames.h"
#include "PIC16Section.h"
#include "llvm/MC/MCContext.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;


// This is the only way to create a PIC16Section. Sections created here
// do not need to be explicitly deleted as they are managed by auto_ptrs.
PIC16Section *PIC16Section::Create(const StringRef &Name,
                                   PIC16SectionType Ty,
                                   const std::string &Address, 
                                   int Color, MCContext &Ctx) {

  /// Determine the internal SectionKind info.
  /// Users of PIC16Section class should not need to know the internal
  /// SectionKind. They should work only with PIC16SectionType.
  ///
  /// PIC16 Terminology for section kinds is as below.
  /// UDATA - BSS
  /// IDATA - initialized data (equiv to Metadata) 
  /// ROMDATA - ReadOnly.
  /// UDATA_OVR - Sections that can be overlaid. Section of such type is
  ///             used to contain function autos an frame. We can think of
  ///             it as equiv to llvm ThreadBSS)
  /// UDATA_SHR - Shared RAM. Memory area that is mapped to all banks.

  SectionKind K;
  switch (Ty) {
    default: llvm_unreachable ("can not create unknown section type");
    case UDATA_OVR: {
      K = SectionKind::getThreadBSS();
      break;
    }
    case UDATA_SHR:
    case UDATA: {
      K = SectionKind::getBSS();
      break;
    }
    case ROMDATA:
    case IDATA: {
      K = SectionKind::getMetadata();
      break;
    }
    case CODE: {
      K = SectionKind::getText();
      break;
    }
      
  }

  // Create the Section.
  PIC16Section *S = new (Ctx) PIC16Section(Name, K, Address, Color);
  S->T = Ty;
  return S;
}

// A generic way to print all types of sections.
void PIC16Section::PrintSwitchToSection(const MCAsmInfo &MAI,
                                          raw_ostream &OS) const {
 
  // If the section is overlaid(i.e. it has a color), print overlay name for 
  // it. Otherwise print its normal name.
  if (Color != -1)
    OS << PAN::getOverlayName(getName(), Color) << '\t';
  else
    OS << getName() << '\t';

  // Print type.
  switch (getType()) {
  default : llvm_unreachable ("unknown section type"); 
  case UDATA: OS << "UDATA"; break;
  case IDATA: OS << "IDATA"; break;
  case ROMDATA: OS << "ROMDATA"; break;
  case UDATA_SHR: OS << "UDATA_SHR"; break;
  case UDATA_OVR: OS << "UDATA_OVR"; break;
  case CODE: OS << "CODE"; break;
  }

  OS << '\t';

  // Print Address.
  OS << Address;

  OS << '\n';
}
