//===----------------------------------------------------------------------===//
#include "llvm/Target/TargetAsmInfo.h"
+#include <cctype>
+#include <cstring>
using namespace llvm;
TargetAsmInfo::TargetAsmInfo() :
- TextSection(".text"),
- DataSection(".data"),
- BSSSection(".bss"),
+ TextSection("\t.text"),
+ DataSection("\t.data"),
+ BSSSection("\t.bss"),
+ TLSDataSection("\t.section .tdata,\"awT\",@progbits"),
+ TLSBSSSection("\t.section .tbss,\"awT\",@nobits"),
ZeroFillDirective(0),
AddressSize(4),
NeedsSet(false),
TextSectionStartSuffix(""),
DataSectionStartSuffix(""),
SectionEndDirectiveSuffix(0),
- ConstantPoolSection("\t.section .rodata\n"),
- JumpTableDataSection("\t.section .rodata\n"),
+ ConstantPoolSection("\t.section .rodata"),
+ JumpTableDataSection("\t.section .rodata"),
JumpTableDirective(0),
CStringSection(0),
StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"),
FourByteConstantSection(0),
EightByteConstantSection(0),
SixteenByteConstantSection(0),
+ ReadOnlySection(0),
GlobalDirective(0),
SetDirective(0),
LCOMMDirective(0),
UsedDirective(0),
WeakRefDirective(0),
HiddenDirective("\t.hidden\t"),
- AbsoluteSectionOffsets(false),
+ ProtectedDirective("\t.protected\t"),
+ AbsoluteDebugSectionOffsets(false),
+ AbsoluteEHSectionOffsets(false),
HasLEB128(false),
HasDotLoc(false),
HasDotFile(false),
+ SupportsDebugInformation(false),
SupportsExceptionHandling(false),
DwarfRequiresFrameSection(true),
DwarfSectionOffsetDirective(0),
/// Measure the specified inline asm to determine an approximation of its
/// length.
+/// Comments (which run till the next SeparatorChar or newline) do not
+/// count as an instruction.
+/// Any other non-whitespace text is considered an instruction, with
+/// multiple instructions separated by SeparatorChar or newlines.
+/// Variable-length instructions are not handled here; this function
+/// may be overloaded in the target code to do that.
unsigned TargetAsmInfo::getInlineAsmLength(const char *Str) const {
// Count the number of instructions in the asm.
- unsigned NumInsts = 0;
+ bool atInsnStart = true;
+ unsigned Length = 0;
for (; *Str; ++Str) {
if (*Str == '\n' || *Str == SeparatorChar)
- ++NumInsts;
+ atInsnStart = true;
+ if (atInsnStart && !isspace(*Str)) {
+ Length += MaxInstLength;
+ atInsnStart = false;
+ }
+ if (atInsnStart && strncmp(Str, CommentString, strlen(CommentString))==0)
+ atInsnStart = false;
}
- // Multiply by the worst-case length for each instruction.
- return NumInsts * MaxInstLength;
+ return Length;
}