remove unused variable
[oota-llvm.git] / lib / Target / ARM / ARMTargetAsmInfo.cpp
1 //===-- ARMTargetAsmInfo.cpp - ARM asm properties ---------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by James M. Laskey and is distributed under the
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the declarations of the ARMTargetAsmInfo properties.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "ARMTargetAsmInfo.h"
15 #include "ARMTargetMachine.h"
16 #include <cstring>
17 #include <cctype>
18 using namespace llvm;
19
20 ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) {
21   const ARMSubtarget *Subtarget = &TM.getSubtarget<ARMSubtarget>();
22   if (Subtarget->isTargetDarwin()) {
23     GlobalPrefix = "_";
24     PrivateGlobalPrefix = "L";
25     BSSSection = 0;                       // no BSS section.
26     ZeroFillDirective = "\t.zerofill\t";  // Uses .zerofill
27     SetDirective = "\t.set";
28     WeakRefDirective = "\t.weak_reference\t";
29     HiddenDirective = "\t.private_extern\t";
30     ProtectedDirective = NULL;
31     JumpTableDataSection = ".const";
32     CStringSection = "\t.cstring";
33     FourByteConstantSection = "\t.literal4\n";
34     EightByteConstantSection = "\t.literal8\n";
35     ReadOnlySection = "\t.const\n";
36     HasDotTypeDotSizeDirective = false;
37     if (TM.getRelocationModel() == Reloc::Static) {
38       StaticCtorsSection = ".constructor";
39       StaticDtorsSection = ".destructor";
40     } else {
41       StaticCtorsSection = ".mod_init_func";
42       StaticDtorsSection = ".mod_term_func";
43     }
44     
45     // In non-PIC modes, emit a special label before jump tables so that the
46     // linker can perform more accurate dead code stripping.
47     if (TM.getRelocationModel() != Reloc::PIC_) {
48       // Emit a local label that is preserved until the linker runs.
49       JumpTableSpecialLabelPrefix = "l";
50     }
51     
52     NeedsSet = true;
53     DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug";
54     DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug";
55     DwarfLineSection = ".section __DWARF,__debug_line,regular,debug";
56     DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug";
57     DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug";
58     DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug";
59     DwarfStrSection = ".section __DWARF,__debug_str,regular,debug";
60     DwarfLocSection = ".section __DWARF,__debug_loc,regular,debug";
61     DwarfARangesSection = ".section __DWARF,__debug_aranges,regular,debug";
62     DwarfRangesSection = ".section __DWARF,__debug_ranges,regular,debug";
63     DwarfMacInfoSection = ".section __DWARF,__debug_macinfo,regular,debug";
64   } else {
65     PrivateGlobalPrefix = ".L";
66     WeakRefDirective = "\t.weak\t";
67     if (Subtarget->isAAPCS_ABI()) {
68       StaticCtorsSection = "\t.section .init_array,\"aw\",%init_array";
69       StaticDtorsSection = "\t.section .fini_array,\"aw\",%fini_array";
70     } else {
71       StaticCtorsSection = "\t.section .ctors,\"aw\",%progbits";
72       StaticDtorsSection = "\t.section .dtors,\"aw\",%progbits";
73     }
74     TLSDataSection = "\t.section .tdata,\"awT\",%progbits";
75     TLSBSSSection = "\t.section .tbss,\"awT\",%nobits";
76   }
77
78   ZeroDirective = "\t.space\t";
79   AlignmentIsInBytes = false;
80   Data64bitsDirective = 0;
81   CommentString = "@";
82   DataSection = "\t.data";
83   ConstantPoolSection = "\t.text\n";
84   COMMDirectiveTakesAlignment = false;
85   InlineAsmStart = "@ InlineAsm Start";
86   InlineAsmEnd = "@ InlineAsm End";
87   LCOMMDirective = "\t.lcomm\t";
88   isThumb = Subtarget->isThumb();
89 }
90
91 /// ARM-specific version of TargetAsmInfo::getInlineAsmLength.
92 unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *Str) const {
93   // Count the number of bytes in the asm.
94   bool atInsnStart = true;
95   unsigned Length = 0;
96   for (; *Str; ++Str) {
97     if (atInsnStart) {
98       // Skip whitespace
99       while (*Str && isspace(*Str) && *Str != '\n')
100         Str++;
101       // Skip label
102       for (const char* p = Str; *p && !isspace(*p); p++)
103         if (*p == ':') {
104           Str = p+1;
105           break;
106         }
107       // Ignore everything from comment char(s) to EOL
108       if (strncmp(Str, CommentString, strlen(CommentString))==-0)
109         atInsnStart = false;
110       else {
111         // An instruction
112         atInsnStart = false;
113         if (isThumb) {
114           // BL and BLX <non-reg> are 4 bytes, all others 2.
115           if ((*Str=='b' || *Str=='B') &&
116               (*(Str+1)=='l' || *(Str+1)=='L')) {
117             if (*(Str+2)=='x' || *(Str+2)=='X') {
118               const char* p = Str+3;
119               while (*p && isspace(*p))
120                 p++;
121               if (*p == 'r' || *p=='R')
122                 Length += 2;    // BLX reg
123               else
124                 Length += 4;    // BLX non-reg
125             }
126             else
127               Length += 4;    // BL
128           } else
129             Length += 2;    // Thumb anything else
130         }
131         else
132           Length += 4;    // ARM
133       }
134     }
135     if (*Str == '\n' || *Str == SeparatorChar)
136       atInsnStart = true;
137   }
138   return Length;
139 }