diff options
author | Dale Johannesen <dalej@apple.com> | 2007-04-23 20:00:17 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2007-04-23 20:00:17 +0000 |
commit | 3bb6283eead6813e87e018879e7cedde3955ea83 (patch) | |
tree | 94f081a440a7b8107e04d711b798fd639481948f /lib | |
parent | 19f5469be4af517aa7953988a6d2e92cc05d4c62 (diff) | |
download | external_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.cpp | 22 |
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; } |