[llvm-commits] CVS: llvm/lib/Target/ARM/ARMTargetAsmInfo.h ARMTargetAsmInfo.cpp
Evan Cheng
evan.cheng at apple.com
Tue May 1 18:10:23 PDT 2007
Woot! Fun stuff. :-)
Thanks Dale.
Evan
On May 1, 2007, at 6:03 PM, Dale Johannesen wrote:
>
>
> Changes in directory llvm/lib/Target/ARM:
>
> ARMTargetAsmInfo.h updated: 1.3 -> 1.4
> ARMTargetAsmInfo.cpp updated: 1.18 -> 1.19
> ---
> Log message:
>
> Add some support for (Darwin) code-generating directives in
> getInlineAsmLength.
> Support is incomplete, but more accurate than gcc's.
>
>
> ---
> Diffs of the changes: (+115 -18)
>
> ARMTargetAsmInfo.cpp | 128 +++++++++++++++++++++++++++++++++++++++
> +++++-------
> ARMTargetAsmInfo.h | 5 +
> 2 files changed, 115 insertions(+), 18 deletions(-)
>
>
> Index: llvm/lib/Target/ARM/ARMTargetAsmInfo.h
> diff -u llvm/lib/Target/ARM/ARMTargetAsmInfo.h:1.3 llvm/lib/Target/
> ARM/ARMTargetAsmInfo.h:1.4
> --- llvm/lib/Target/ARM/ARMTargetAsmInfo.h:1.3 Sun Apr 29 14:17:45
> 2007
> +++ llvm/lib/Target/ARM/ARMTargetAsmInfo.h Tue May 1 20:02:40 2007
> @@ -15,6 +15,7 @@
> #define ARMTARGETASMINFO_H
>
> #include "llvm/Target/TargetAsmInfo.h"
> +#include "ARMSubtarget.h"
>
> namespace llvm {
>
> @@ -24,9 +25,11 @@
> struct ARMTargetAsmInfo : public TargetAsmInfo {
> ARMTargetAsmInfo(const ARMTargetMachine &TM);
>
> - bool isThumb;
> + const ARMSubtarget *Subtarget;
>
> virtual unsigned getInlineAsmLength(const char *Str) const;
> + unsigned countArguments(const char *p) const;
> + unsigned countString(const char *p) const;
> };
>
>
>
>
> Index: llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp
> diff -u llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp:1.18 llvm/lib/
> Target/ARM/ARMTargetAsmInfo.cpp:1.19
> --- llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp:1.18 Sun Apr 29
> 19:30:48 2007
> +++ llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp Tue May 1 20:02:40 2007
> @@ -1,3 +1,4 @@
> +
> //===-- ARMTargetAsmInfo.cpp - ARM asm properties ---------------
> *- C++ -*-===//
> //
> // The LLVM Compiler Infrastructure
> @@ -18,7 +19,7 @@
> using namespace llvm;
>
> ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) {
> - const ARMSubtarget *Subtarget = &TM.getSubtarget<ARMSubtarget>();
> + Subtarget = &TM.getSubtarget<ARMSubtarget>();
> if (Subtarget->isTargetDarwin()) {
> GlobalPrefix = "_";
> PrivateGlobalPrefix = "L";
> @@ -85,13 +86,42 @@
> InlineAsmStart = "@ InlineAsm Start";
> InlineAsmEnd = "@ InlineAsm End";
> LCOMMDirective = "\t.lcomm\t";
> - isThumb = Subtarget->isThumb();
> +}
> +
> +/// Count the number of comma-separated arguments.
> +/// Do not try to detect errors.
> +unsigned ARMTargetAsmInfo::countArguments(const char* p) const {
> + unsigned count = 0;
> + while (*p && isspace(*p) && *p != '\n')
> + p++;
> + count++;
> + while (*p && *p!='\n' &&
> + strncmp(p, CommentString, strlen(CommentString))!=0) {
> + if (*p==',')
> + count++;
> + p++;
> + }
> + return count;
> +}
> +
> +/// Count the length of a string enclosed in quote characters.
> +/// Do not try to detect errors.
> +unsigned ARMTargetAsmInfo::countString(const char* p) const {
> + unsigned count = 0;
> + while (*p && isspace(*p) && *p!='\n')
> + p++;
> + if (!*p || *p != '\"')
> + return count;
> + while (*++p && *p != '\"')
> + count++;
> + return count;
> }
>
> /// ARM-specific version of TargetAsmInfo::getInlineAsmLength.
> unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *Str)
> const {
> // Count the number of bytes in the asm.
> bool atInsnStart = true;
> + bool inTextSection = true;
> unsigned Length = 0;
> for (; *Str; ++Str) {
> if (atInsnStart) {
> @@ -102,30 +132,94 @@
> for (const char* p = Str; *p && !isspace(*p); p++)
> if (*p == ':') {
> Str = p+1;
> + while (*Str && isspace(*Str) && *Str != '\n')
> + Str++;
> break;
> }
> // Ignore everything from comment char(s) to EOL
> if (strncmp(Str, CommentString, strlen(CommentString))==-0)
> atInsnStart = false;
> - else {
> + // FIXME do something like the following for non-Darwin
> + else if (*Str == '.' && Subtarget->isTargetDarwin()) {
> + // Directive.
> + atInsnStart = false;
> + // Some change the section, but don't generate code.
> + if (strncasecmp(Str, ".literal4", strlen(".literal4"))==0 ||
> + strncasecmp(Str, ".literal8", strlen(".literal8"))==0 ||
> + strncasecmp(Str, ".const", strlen(".const"))==0 ||
> + strncasecmp(Str, ".constructor", strlen
> (".constructor"))==0 ||
> + strncasecmp(Str, ".cstring", strlen(".cstring"))==0 ||
> + strncasecmp(Str, ".data", strlen(".data"))==0 ||
> + strncasecmp(Str, ".destructor", strlen(".destructor"))
> ==0 ||
> + strncasecmp(Str, ".fvmlib_init0", strlen
> (".fvmlib_init0"))==0 ||
> + strncasecmp(Str, ".fvmlib_init1", strlen
> (".fvmlib_init1"))==0 ||
> + strncasecmp(Str, ".mod_init_func", strlen
> (".mod_init_func"))==0 ||
> + strncasecmp(Str, ".mod_term_func", strlen
> (".mod_term_func"))==0 ||
> + strncasecmp(Str, ".picsymbol_stub", strlen
> (".picsymbol_stub"))==0 ||
> + strncasecmp(Str, ".symbol_stub", strlen
> (".symbol_stub"))==0 ||
> + strncasecmp(Str, ".static_data", strlen
> (".static_data"))==0 ||
> + strncasecmp(Str, ".section", strlen(".section"))==0 ||
> + strncasecmp(Str, ".lazy_symbol_pointer", strlen
> (".lazy_symbol_pointer"))==0 ||
> + strncasecmp(Str, ".non_lazy_symbol_pointer", strlen
> (".non_lazy_symbol_pointer"))==0 ||
> + strncasecmp(Str, ".dyld", strlen(".dyld"))==0 ||
> + strncasecmp(Str, ".const_data", strlen(".const_data"))
> ==0 ||
> + strncasecmp(Str, ".objc", strlen(".objc"))==0
> || //// many directives
> + strncasecmp(Str, ".static_const", strlen
> (".static_const"))==0)
> + inTextSection=false;
> + else if (strncasecmp(Str, ".text", strlen(".text"))==0)
> + inTextSection = true;
> + // Some can't really be handled without implementing
> significant pieces
> + // of an assembler. Others require dynamic adjustment of
> block sizes in
> + // AdjustBBOffsetsAfter; it's a big compile-time speed hit
> to check every
> + // instruction in there, and none of these are currently
> used in the kernel.
> + else if (strncasecmp(Str, ".macro", strlen(".macro"))==0 ||
> + strncasecmp(Str, ".if", strlen(".if"))==0 ||
> + strncasecmp(Str, ".align", strlen(".align"))==0 ||
> + strncasecmp(Str, ".fill", strlen(".fill"))==0 ||
> + strncasecmp(Str, ".space", strlen(".space"))==0 ||
> + strncasecmp(Str, ".zerofill", strlen(".zerofill"))
> ==0 ||
> + strncasecmp(Str, ".p2align", strlen(".p2align"))
> ==0 ||
> + strncasecmp(Str, ".p2alignw", strlen(".p2alignw"))
> ==0 ||
> + strncasecmp(Str, ".p2alignl", strlen(".p2alignl"))
> ==0 ||
> + strncasecmp(Str, ".align32", strlen(".p2align32"))
> ==0 ||
> + strncasecmp(Str, ".include", strlen(".include"))==0)
> + cerr << "Directive " << Str << " in asm may lead to
> invalid offsets for" <<
> + " constant pools (the assembler will tell you
> if this happens).\n";
> + // Some generate code, but this is only interesting in the
> text section.
> + else if (inTextSection) {
> + if (strncasecmp(Str, ".long", strlen(".long"))==0)
> + Length += 4*countArguments(Str+strlen(".long"));
> + else if (strncasecmp(Str, ".short", strlen(".short"))==0)
> + Length += 2*countArguments(Str+strlen(".short"));
> + else if (strncasecmp(Str, ".byte", strlen(".byte"))==0)
> + Length += 1*countArguments(Str+strlen(".byte"));
> + else if (strncasecmp(Str, ".single", strlen(".single"))==0)
> + Length += 4*countArguments(Str+strlen(".single"));
> + else if (strncasecmp(Str, ".double", strlen(".double"))==0)
> + Length += 8*countArguments(Str+strlen(".double"));
> + else if (strncasecmp(Str, ".quad", strlen(".quad"))==0)
> + Length += 16*countArguments(Str+strlen(".quad"));
> + else if (strncasecmp(Str, ".ascii", strlen(".ascii"))==0)
> + Length += countString(Str+strlen(".ascii"));
> + else if (strncasecmp(Str, ".asciz", strlen(".asciz"))==0)
> + Length += countString(Str+strlen(".asciz"))+1;
> + }
> + } else if (inTextSection) {
> // An instruction
> atInsnStart = false;
> - if (isThumb) {
> + if (Subtarget->isThumb()) {
> // BL and BLX <non-reg> are 4 bytes, all others 2.
> - 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
> - }
> + if (strncasecmp(Str, "blx", strlen("blx"))==0) {
> + const char* p = Str+3;
> + while (*p && isspace(*p))
> + p++;
> + if (*p == 'r' || *p=='R')
> + Length += 2; // BLX reg
> else
> - Length += 4; // BL
> - } else
> + Length += 4; // BLX non-reg
> + } else if (strncasecmp(Str, "bl", strlen("bl"))==0)
> + Length += 4; // BL
> + else
> Length += 2; // Thumb anything else
> }
> else
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list