It's not necessary to do rounding for alloca operations when the requested
alignment is equal to the stack alignment.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40004 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
new file mode 100644
index 0000000..df7a2ec
--- /dev/null
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -0,0 +1,131 @@
+//===-- TargetAsmInfo.cpp - Asm Info ---------------------------------------==//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by James M. Laskey and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines target asm properties related what form asm statements
+// should take.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Target/TargetAsmInfo.h"
+#include <cctype>
+#include <cstring>
+
+using namespace llvm;
+
+TargetAsmInfo::TargetAsmInfo() :
+  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),
+  MaxInstLength(4),
+  PCSymbol("$"),
+  SeparatorChar(';'),
+  CommentString("#"),
+  GlobalPrefix(""),
+  PrivateGlobalPrefix("."),
+  JumpTableSpecialLabelPrefix(0),
+  GlobalVarAddrPrefix(""),
+  GlobalVarAddrSuffix(""),
+  FunctionAddrPrefix(""),
+  FunctionAddrSuffix(""),
+  InlineAsmStart("#APP"),
+  InlineAsmEnd("#NO_APP"),
+  AssemblerDialect(0),
+  ZeroDirective("\t.zero\t"),
+  ZeroDirectiveSuffix(0),
+  AsciiDirective("\t.ascii\t"),
+  AscizDirective("\t.asciz\t"),
+  Data8bitsDirective("\t.byte\t"),
+  Data16bitsDirective("\t.short\t"),
+  Data32bitsDirective("\t.long\t"),
+  Data64bitsDirective("\t.quad\t"),
+  AlignDirective("\t.align\t"),
+  AlignmentIsInBytes(true),
+  SwitchToSectionDirective("\t.section\t"),
+  TextSectionStartSuffix(""),
+  DataSectionStartSuffix(""),
+  SectionEndDirectiveSuffix(0),
+  ConstantPoolSection("\t.section .rodata"),
+  JumpTableDataSection("\t.section .rodata"),
+  JumpTableDirective(0),
+  CStringSection(0),
+  StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"),
+  StaticDtorsSection("\t.section .dtors,\"aw\",@progbits"),
+  FourByteConstantSection(0),
+  EightByteConstantSection(0),
+  SixteenByteConstantSection(0),
+  ReadOnlySection(0),
+  GlobalDirective(0),
+  SetDirective(0),
+  LCOMMDirective(0),
+  COMMDirective("\t.comm\t"),
+  COMMDirectiveTakesAlignment(true),
+  HasDotTypeDotSizeDirective(true),
+  UsedDirective(0),
+  WeakRefDirective(0),
+  HiddenDirective("\t.hidden\t"),
+  ProtectedDirective("\t.protected\t"),
+  AbsoluteDebugSectionOffsets(false),
+  AbsoluteEHSectionOffsets(false),
+  HasLEB128(false),
+  HasDotLoc(false),
+  HasDotFile(false),
+  SupportsDebugInformation(false),
+  SupportsExceptionHandling(false),
+  DwarfRequiresFrameSection(true),
+  DwarfSectionOffsetDirective(0),
+  DwarfAbbrevSection(".debug_abbrev"),
+  DwarfInfoSection(".debug_info"),
+  DwarfLineSection(".debug_line"),
+  DwarfFrameSection(".debug_frame"),
+  DwarfPubNamesSection(".debug_pubnames"),
+  DwarfPubTypesSection(".debug_pubtypes"),
+  DwarfStrSection(".debug_str"),
+  DwarfLocSection(".debug_loc"),
+  DwarfARangesSection(".debug_aranges"),
+  DwarfRangesSection(".debug_ranges"),
+  DwarfMacInfoSection(".debug_macinfo"),
+  DwarfEHFrameSection(".eh_frame"),
+  DwarfExceptionSection(".gcc_except_table"),
+  AsmTransCBE(0) {
+}
+
+TargetAsmInfo::~TargetAsmInfo() {
+}
+
+/// 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.
+  bool atInsnStart = true;
+  unsigned Length = 0;
+  for (; *Str; ++Str) {
+    if (*Str == '\n' || *Str == SeparatorChar)
+      atInsnStart = true;
+    if (atInsnStart && !isspace(*Str)) {
+      Length += MaxInstLength;
+      atInsnStart = false;
+    }
+    if (atInsnStart && strncmp(Str, CommentString, strlen(CommentString))==0)
+      atInsnStart = false;
+  }
+
+  return Length;
+}
+