[rtems-tools commit] covoar: Add aarch64 target

Joel Sherrill joel at rtems.org
Tue Mar 30 18:20:46 UTC 2021


Module:    rtems-tools
Branch:    master
Commit:    d9454cae2abe34a189f5956f93f8fb47c4a04834
Changeset: http://git.rtems.org/rtems-tools/commit/?id=d9454cae2abe34a189f5956f93f8fb47c4a04834

Author:    Alex White <alex.white at oarcorp.com>
Date:      Wed Feb 24 15:53:22 2021 -0600

covoar: Add aarch64 target

---

 tester/covoar/TargetFactory.cc  |   2 +
 tester/covoar/Target_aarch64.cc | 100 ++++++++++++++++++++++++++++++++++++++++
 tester/covoar/Target_aarch64.h  |  77 +++++++++++++++++++++++++++++++
 tester/covoar/wscript           |   1 +
 4 files changed, 180 insertions(+)

diff --git a/tester/covoar/TargetFactory.cc b/tester/covoar/TargetFactory.cc
index 12de94d..57ba686 100644
--- a/tester/covoar/TargetFactory.cc
+++ b/tester/covoar/TargetFactory.cc
@@ -17,6 +17,7 @@
 
 #include "TargetFactory.h"
 
+#include "Target_aarch64.h"
 #include "Target_arm.h"
 #include "Target_i386.h"
 #include "Target_m68k.h"
@@ -51,6 +52,7 @@ namespace Target {
   //! All must be derived from TargetBase.
   //!
   static FactoryEntry_t FactoryTable[] = {
+    { "aarch64", Target_aarch64_Constructor },
     { "arm",     Target_arm_Constructor },
     { "i386",    Target_i386_Constructor },
     { "lm32",    Target_lm32_Constructor },
diff --git a/tester/covoar/Target_aarch64.cc b/tester/covoar/Target_aarch64.cc
new file mode 100644
index 0000000..64472d6
--- /dev/null
+++ b/tester/covoar/Target_aarch64.cc
@@ -0,0 +1,100 @@
+/*! @file Target_aarch64.cc
+ *  @brief Target_aarch64 Implementation
+ *
+ *  This file contains the implementation of the base class for
+ *  functions supporting target unique functionallity.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <rld.h>
+
+#include "Target_aarch64.h"
+
+namespace Target {
+
+  Target_aarch64::Target_aarch64( std::string targetName ):
+    TargetBase( targetName )
+  {
+    conditionalBranchInstructions.push_back("cbnz");
+    conditionalBranchInstructions.push_back("cbz");
+    conditionalBranchInstructions.push_back("tbnz");
+    conditionalBranchInstructions.push_back("tbz");
+    conditionalBranchInstructions.push_back("b.eq");
+    conditionalBranchInstructions.push_back("b.ne");
+    conditionalBranchInstructions.push_back("b.cs");
+    conditionalBranchInstructions.push_back("b.hs");
+    conditionalBranchInstructions.push_back("b.cc");
+    conditionalBranchInstructions.push_back("b.lo");
+    conditionalBranchInstructions.push_back("b.mi");
+    conditionalBranchInstructions.push_back("b.pl");
+    conditionalBranchInstructions.push_back("b.vs");
+    conditionalBranchInstructions.push_back("b.vc");
+    conditionalBranchInstructions.push_back("b.hi");
+    conditionalBranchInstructions.push_back("b.ls");
+    conditionalBranchInstructions.push_back("b.ge");
+    conditionalBranchInstructions.push_back("b.lt");
+    conditionalBranchInstructions.push_back("b.gt");
+    conditionalBranchInstructions.push_back("b.le");
+
+    conditionalBranchInstructions.sort();
+  }
+
+  Target_aarch64::~Target_aarch64()
+  {
+  }
+
+  bool Target_aarch64::isNopLine(
+    const char* const line,
+    int&              size
+  )
+  {
+    if (!strcmp( &line[strlen(line)-3], "nop")) {
+      size = 4;
+      return true;
+    }
+
+    if (!strncmp( &line[strlen(line)-6], "udf", 3)) {
+      size = 4;
+      return true;
+    }
+
+    // On ARM, there are literal tables at the end of methods.
+    // We need to avoid them.
+    if (!strncmp( &line[strlen(line)-10], ".byte", 5)) {
+      size = 1;
+      return true;
+    }
+    if (!strncmp( &line[strlen(line)-13], ".short", 6)) {
+      size = 2;
+      return true;
+    }
+    if (!strncmp( &line[strlen(line)-16], ".word", 5)) {
+      size = 4;
+      return true;
+    }
+
+    return false;
+  }
+
+  bool Target_aarch64::isBranch(
+      const char* instruction
+  )
+  {
+    throw rld::error(
+      "DETERMINE BRANCH INSTRUCTIONS FOR THIS ARCHITECTURE! -- fix me",
+      "Target_aarch64::isBranch"
+    );
+  }
+
+  TargetBase *Target_aarch64_Constructor(
+    std::string          targetName
+  )
+  {
+    return new Target_aarch64( targetName );
+  }
+
+}
diff --git a/tester/covoar/Target_aarch64.h b/tester/covoar/Target_aarch64.h
new file mode 100644
index 0000000..26fedb6
--- /dev/null
+++ b/tester/covoar/Target_aarch64.h
@@ -0,0 +1,77 @@
+/*! @file Target_aarch64.h
+ *  @brief Target_aarch64 Specification
+ *
+ *  This file contains the specification of the Target_aarch64 class.
+ */
+
+#ifndef __TARGET_AARCH64_H__
+#define __TARGET_AARCH64_H__
+
+#include <list>
+#include <string>
+#include "TargetBase.h"
+
+namespace Target {
+
+  /*! @class Target_aarch64
+   *
+   *  This class is the Target class for the aarch64 processor.
+   *
+   */
+  class Target_aarch64: public TargetBase {
+
+  public:
+
+    /*!
+     *  This method constructs an Target_aarch64 instance.
+     */
+    Target_aarch64( std::string targetName );
+
+    /*!
+     *  This method destructs an Target_aarch64 instance.
+     */
+    virtual ~Target_aarch64();
+
+    /*!
+     *  This method determines whether the specified line from a
+     *  objdump file is a nop instruction.
+     *
+     *  @param[in] line contains the object dump line to check
+     *  @param[out] size is set to the size in bytes of the nop
+     *
+     *  @return Returns TRUE if the instruction is a nop, FALSE otherwise.
+     */
+    bool isNopLine(
+      const char* const line,
+      int&              size
+    );
+
+    /*!
+     *  This method determines if the specified line from an
+     *  objdump file is a branch instruction.
+     */
+    bool isBranch(
+      const char* const instruction
+    );
+
+  private:
+
+  };
+
+  //!
+  //! @brief Constructor Helper
+  //!
+  //! This is a constructor helper for this class which can be used in support
+  //! of factories.
+  //!
+  //! @param [in] Targetname is the name of the Target being constructed.
+  //!
+  //! @return This method constructs a new instance of the Target and returns
+  //!         that to the caller.
+  //!
+  TargetBase *Target_aarch64_Constructor(
+    std::string          targetName
+  );
+
+}
+#endif
diff --git a/tester/covoar/wscript b/tester/covoar/wscript
index 165a1b8..82599b0 100644
--- a/tester/covoar/wscript
+++ b/tester/covoar/wscript
@@ -106,6 +106,7 @@ def build(bld):
                         'ReportsText.cc',
                         'ReportsHtml.cc',
                         'SymbolTable.cc',
+                        'Target_aarch64.cc',
                         'Target_arm.cc',
                         'TargetBase.cc',
                         'TargetFactory.cc',



More information about the vc mailing list