1*5c96de3aSDylan McKay //===-- AVRTargetObjectFile.cpp - AVR Object Files ------------------------===//
2*5c96de3aSDylan McKay //
3*5c96de3aSDylan McKay //                     The LLVM Compiler Infrastructure
4*5c96de3aSDylan McKay //
5*5c96de3aSDylan McKay // This file is distributed under the University of Illinois Open Source
6*5c96de3aSDylan McKay // License. See LICENSE.TXT for details.
7*5c96de3aSDylan McKay //
8*5c96de3aSDylan McKay //===----------------------------------------------------------------------===//
9*5c96de3aSDylan McKay 
10*5c96de3aSDylan McKay #include "AVRTargetObjectFile.h"
11*5c96de3aSDylan McKay 
12*5c96de3aSDylan McKay #include "llvm/IR/DerivedTypes.h"
13*5c96de3aSDylan McKay #include "llvm/IR/GlobalValue.h"
14*5c96de3aSDylan McKay #include "llvm/IR/Mangler.h"
15*5c96de3aSDylan McKay #include "llvm/MC/MCContext.h"
16*5c96de3aSDylan McKay #include "llvm/MC/MCSectionELF.h"
17*5c96de3aSDylan McKay #include "llvm/Support/ELF.h"
18*5c96de3aSDylan McKay 
19*5c96de3aSDylan McKay #include "AVR.h"
20*5c96de3aSDylan McKay 
21*5c96de3aSDylan McKay namespace llvm {
22*5c96de3aSDylan McKay void AVRTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
23*5c96de3aSDylan McKay   Base::Initialize(Ctx, TM);
24*5c96de3aSDylan McKay   ProgmemDataSection =
25*5c96de3aSDylan McKay       Ctx.getELFSection(".progmem.data", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
26*5c96de3aSDylan McKay }
27*5c96de3aSDylan McKay 
28*5c96de3aSDylan McKay MCSection *
29*5c96de3aSDylan McKay AVRTargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
30*5c96de3aSDylan McKay                                             SectionKind Kind, Mangler &Mang,
31*5c96de3aSDylan McKay                                             const TargetMachine &TM) const {
32*5c96de3aSDylan McKay   // Global values in flash memory are placed in the progmem.data section
33*5c96de3aSDylan McKay   // unless they already have a user assigned section.
34*5c96de3aSDylan McKay   if (AVR::isProgramMemoryAddress(GV) && !GV->hasSection())
35*5c96de3aSDylan McKay     return ProgmemDataSection;
36*5c96de3aSDylan McKay 
37*5c96de3aSDylan McKay   // Otherwise, we work the same way as ELF.
38*5c96de3aSDylan McKay   return Base::SelectSectionForGlobal(GV, Kind, Mang, TM);
39*5c96de3aSDylan McKay }
40*5c96de3aSDylan McKay } // end of namespace llvm
41