aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2007-04-23 20:00:17 +0000
committerDale Johannesen <dalej@apple.com>2007-04-23 20:00:17 +0000
commit3bb6283eead6813e87e018879e7cedde3955ea83 (patch)
tree94f081a440a7b8107e04d711b798fd639481948f /lib
parent19f5469be4af517aa7953988a6d2e92cc05d4c62 (diff)
downloadexternal_llvm-3bb6283eead6813e87e018879e7cedde3955ea83.zip
external_llvm-3bb6283eead6813e87e018879e7cedde3955ea83.tar.gz
external_llvm-3bb6283eead6813e87e018879e7cedde3955ea83.tar.bz2
Fix generic getInlineAsmLength
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36369 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/TargetAsmInfo.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index 62c8b90..8deda9f 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -13,6 +13,8 @@
//===----------------------------------------------------------------------===//
#include "llvm/Target/TargetAsmInfo.h"
+#include <cctype>
+#include <cstring>
using namespace llvm;
@@ -100,15 +102,27 @@ 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.
- 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;
}