diff options
author | Alex White <alex.white@oarcorp.com> | 2021-02-24 15:53:22 -0600 |
---|---|---|
committer | Joel Sherrill <joel@rtems.org> | 2021-03-30 13:15:57 -0500 |
commit | d9454cae2abe34a189f5956f93f8fb47c4a04834 (patch) | |
tree | 48030163aea7e6f93a7ca5c4081f467c6721b510 /tester/covoar/Target_aarch64.cc | |
parent | covoar/TargetBase: Rename branchInstructions to conditionalBranchInstructions (diff) | |
download | rtems-tools-d9454cae2abe34a189f5956f93f8fb47c4a04834.tar.bz2 |
covoar: Add aarch64 target
Diffstat (limited to 'tester/covoar/Target_aarch64.cc')
-rw-r--r-- | tester/covoar/Target_aarch64.cc | 100 |
1 files changed, 100 insertions, 0 deletions
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 ); + } + +} |