summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2007-04-29 19:17:45 +0000
committerDale Johannesen <dalej@apple.com>2007-04-29 19:17:45 +0000
commit8650199fbb192c054f85647843b89e1182855718 (patch)
treea96a3c3015793fa6b2e9750103ecd1ae49f3339f /lib
parentbd40a6d3ee9658f9bfd6ab74893fca5fa75c6de0 (diff)
downloadllvm-8650199fbb192c054f85647843b89e1182855718.tar.gz
llvm-8650199fbb192c054f85647843b89e1182855718.tar.bz2
llvm-8650199fbb192c054f85647843b89e1182855718.tar.xz
Make ARM-specific version of getInlineAsmLength
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36572 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/ARM/ARMTargetAsmInfo.cpp51
-rw-r--r--lib/Target/ARM/ARMTargetAsmInfo.h2
2 files changed, 53 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMTargetAsmInfo.cpp b/lib/Target/ARM/ARMTargetAsmInfo.cpp
index 196348b9e9..3d24d60c6a 100644
--- a/lib/Target/ARM/ARMTargetAsmInfo.cpp
+++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp
@@ -86,3 +86,54 @@ ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) {
LCOMMDirective = "\t.lcomm\t";
isThumb = Subtarget->isThumb();
}
+
+/// ARM-specific version of TargetAsmInfo::getInlineAsmLength.
+unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *Str) const {
+ // Count the number of bytes in the asm.
+ bool atInsnStart = true;
+ unsigned Length = 0;
+ for (; *Str; ++Str) {
+ if (atInsnStart) {
+ // Skip whitespace
+ while (*Str && isspace(*Str) && *Str != '\n')
+ Str++;
+ // Skip label
+ for (const char* p = Str; *p && !isspace(*p); p++)
+ if (*p == ':') {
+ Str = p+1;
+ break;
+ }
+ // Ignore everything from comment char(s) to EOL
+ if (strncmp(Str, CommentString, strlen(CommentString))==-0)
+ atInsnStart = false;
+ else {
+ // An instruction
+ atInsnStart = false;
+ if (isThumb) {
+ // BL and BLX <non-reg> are 4 bytes, all others 2.
+ const char*p = Str;
+ if ((*Str=='b' || *Str=='B') &&
+ (*(Str+1)=='l' || *(Str+1)=='L')) {
+ if (*(Str+2)=='x' || *(Str+2)=='X') {
+ const char* p = Str+3;
+ while (*p && isspace(*p))
+ p++;
+ if (*p == 'r' || *p=='R')
+ Length += 2; // BLX reg
+ else
+ Length += 4; // BLX non-reg
+ }
+ else
+ Length += 4; // BL
+ } else
+ Length += 2; // Thumb anything else
+ }
+ else
+ Length += 4; // ARM
+ }
+ }
+ if (*Str == '\n' || *Str == SeparatorChar)
+ atInsnStart = true;
+ }
+ return Length;
+}
diff --git a/lib/Target/ARM/ARMTargetAsmInfo.h b/lib/Target/ARM/ARMTargetAsmInfo.h
index 3fb9bb0066..441be2bd75 100644
--- a/lib/Target/ARM/ARMTargetAsmInfo.h
+++ b/lib/Target/ARM/ARMTargetAsmInfo.h
@@ -25,6 +25,8 @@ namespace llvm {
ARMTargetAsmInfo(const ARMTargetMachine &TM);
bool isThumb;
+
+ virtual unsigned getInlineAsmLength(const char *Str) const;
};