blob: 10b1d843f9975d8694415468d8564725f6817b0b [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===-- MipsTargetAsmInfo.cpp - Mips asm properties -------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the declarations of the MipsTargetAsmInfo properties.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MipsTargetAsmInfo.h"
Bruno Cardoso Lopesea377302007-11-12 19:49:57 +000015#include "MipsTargetMachine.h"
Dan Gohmanc1544492008-08-05 15:32:23 +000016#include "llvm/GlobalVariable.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000017
18using namespace llvm;
19
asldedcd842008-07-19 13:16:11 +000020MipsTargetAsmInfo::MipsTargetAsmInfo(const MipsTargetMachine &TM):
21 ELFTargetAsmInfo(TM) {
Bruno Cardoso Lopes29c15352008-07-14 14:42:54 +000022
Bruno Cardoso Lopes69ca2ca2008-07-23 16:01:50 +000023 Subtarget = &TM.getSubtarget<MipsSubtarget>();
Bruno Cardoso Lopes8291a622008-07-22 15:34:27 +000024
Bruno Cardoso Lopes29c15352008-07-14 14:42:54 +000025 AlignmentIsInBytes = false;
26 COMMDirectiveTakesAlignment = true;
27 Data16bitsDirective = "\t.half\t";
28 Data32bitsDirective = "\t.word\t";
29 Data64bitsDirective = NULL;
30 PrivateGlobalPrefix = "$";
31 JumpTableDataSection = "\t.rdata";
32 CommentString = "#";
33 ReadOnlySection = "\t.rdata";
34 ZeroDirective = "\t.space\t";
35 BSSSection = "\t.section\t.bss";
Bruno Cardoso Lopes12355a82008-07-21 18:52:34 +000036 CStringSection = ".rodata.str";
Bruno Cardoso Lopes8642dfd2008-07-28 19:11:24 +000037 FourByteConstantSection = "\t.section\t.rodata.cst4,\"aM\",@progbits,4";
Bruno Cardoso Lopesea377302007-11-12 19:49:57 +000038
Bruno Cardoso Lopes69ca2ca2008-07-23 16:01:50 +000039 if (!Subtarget->hasABICall()) {
Bruno Cardoso Lopesea377302007-11-12 19:49:57 +000040 JumpTableDirective = "\t.word\t";
Bruno Cardoso Lopes69ca2ca2008-07-23 16:01:50 +000041 SmallDataSection = getNamedSection("\t.sdata", SectionFlags::Writeable);
42 SmallBSSSection = getNamedSection("\t.sbss", SectionFlags::Writeable |
43 SectionFlags::BSS);
44 } else
Bruno Cardoso Lopesea377302007-11-12 19:49:57 +000045 JumpTableDirective = "\t.gpword\t";
Bruno Cardoso Lopes69ca2ca2008-07-23 16:01:50 +000046
Bruno Cardoso Lopes8291a622008-07-22 15:34:27 +000047}
Bruno Cardoso Lopesea377302007-11-12 19:49:57 +000048
Bruno Cardoso Lopes91c2ada2008-07-30 17:04:04 +000049unsigned MipsTargetAsmInfo::
50SectionFlagsForGlobal(const GlobalValue *GV, const char* Name) const {
51 unsigned Flags = ELFTargetAsmInfo::SectionFlagsForGlobal(GV, Name);
52 // Mask out Small Section flag bit, Mips doesnt support 's' section symbol
53 // for its small sections.
54 return (Flags & (~SectionFlags::Small));
55}
56
57SectionKind::Kind MipsTargetAsmInfo::
58SectionKindForGlobal(const GlobalValue *GV) const {
Bruno Cardoso Lopes33724392008-07-22 16:24:21 +000059 SectionKind::Kind K = ELFTargetAsmInfo::SectionKindForGlobal(GV);
Bruno Cardoso Lopes8291a622008-07-22 15:34:27 +000060
Bruno Cardoso Lopes69ca2ca2008-07-23 16:01:50 +000061 if (Subtarget->hasABICall())
62 return K;
63
Bruno Cardoso Lopes33724392008-07-22 16:24:21 +000064 if (K != SectionKind::Data && K != SectionKind::BSS &&
65 K != SectionKind::RODataMergeConst)
66 return K;
67
68 if (isa<GlobalVariable>(GV)) {
69 const TargetData *TD = ETM->getTargetData();
70 unsigned Size = TD->getABITypeSize(GV->getType()->getElementType());
Bruno Cardoso Lopes69ca2ca2008-07-23 16:01:50 +000071 unsigned Threshold = Subtarget->getSSectionThreshold();
Bruno Cardoso Lopes33724392008-07-22 16:24:21 +000072
73 if (Size > 0 && Size <= Threshold) {
74 if (K == SectionKind::BSS)
75 return SectionKind::SmallBSS;
76 else
77 return SectionKind::SmallData;
78 }
Bruno Cardoso Lopes8291a622008-07-22 15:34:27 +000079 }
80
Bruno Cardoso Lopes33724392008-07-22 16:24:21 +000081 return K;
Bruno Cardoso Lopes8291a622008-07-22 15:34:27 +000082}
83
Bruno Cardoso Lopes91c2ada2008-07-30 17:04:04 +000084const Section* MipsTargetAsmInfo::
85SelectSectionForGlobal(const GlobalValue *GV) const {
Bruno Cardoso Lopes8291a622008-07-22 15:34:27 +000086 SectionKind::Kind K = SectionKindForGlobal(GV);
87 const GlobalVariable *GVA = dyn_cast<GlobalVariable>(GV);
88
89 if (GVA && (!GVA->isWeakForLinker()))
90 switch (K) {
91 case SectionKind::SmallData:
92 return getSmallDataSection();
93 case SectionKind::SmallBSS:
94 return getSmallBSSSection();
95 default: break;
96 }
97
98 return ELFTargetAsmInfo::SelectSectionForGlobal(GV);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000099}