From 330cba0ff7c50208a04e5b50888ec7196786e851 Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Wed, 7 May 2025 14:01:08 +0100 Subject: [PATCH 1/8] Initial new migrate-ease LP --- assets/contributors.csv | 2 +- .../migrate-ease/1_CodeScanning.md | 30 ++++ .../migrate-ease/2_migrate_ease_spec.md | 64 +++++++ .../migrate-ease/3_migrate_ease_run.md | 77 +++++++++ .../migrate-ease/4_migrate_ease_analysis.md | 163 ++++++++++++++++++ .../migrate-ease/_index.md | 60 +++++++ .../migrate-ease/_next-steps.md | 8 + 7 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md diff --git a/assets/contributors.csv b/assets/contributors.csv index 61a086e88e..4116c50c9e 100644 --- a/assets/contributors.csv +++ b/assets/contributors.csv @@ -85,4 +85,4 @@ Yiyang Fan,Arm,,,, Julien Jayat,Arm,,,, Geremy Cohen,Arm,geremyCohen,geremyinanutshell,, Barbara Corriero,Arm,,,, - +Jun He, Arm,,,, diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md new file mode 100644 index 0000000000..3c1d358054 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md @@ -0,0 +1,30 @@ +--- +# User change +title: "Why Code Scanning Matters for Arm Migration" + +weight: 2 + +layout: "learningpathall" + +--- + +### Overview of the Common Arm Migration Challenge + +Migrating applications to Arm-based architectures is increasingly common across cloud, data center, and edge environments. Arm-powered servers and instances, such as AWS Graviton processors or Ampere Altra-based systems available on platforms like Google Cloud Platform, Microsoft Azure, Alibaba Cloud and Oracle Cloud Infrastructure (OCI), deliver significant performance-per-watt advantages and compelling cost-efficiency. + +However, porting workloads to new CPU architecture often involves more than just recompiling. While many applications transition smoothly, others contain architecture-specific code or dependencies – developed originally for x86 – that can lead to build failures, runtime errors, or performance degradation on Arm systems. + +Common challenges include detecting: +* Hardcoded x86 SIMD intrinsics +* Inline assembly +* Platform-specific system calls +* Unsupported compiler flags +* Non-portable build scripts or logic + +In large or legacy codebases, these issues are often buried in third-party libraries or auto-generated components, making manual inspection slow and unreliable. + +### Automated Analysis for Portability +To address these challenges proactively, automated static analysis tools play a critical role. Tools specifically designed for portability analysis enable developers to scan local codebases or remote repositories (e.g., GitHub) —and pinpoint architecture-specific constructs before attempting compilation or deployment on Arm. By surfacing portability concerns early in the development cycle, code scanning reduces time-to-first-build and helps prevent complex failures later. + +In this learning path, we will introduce `migrate-ease`, a tool which allows developers to move beyond trial-and-error debugging. It provides clear, actionable insights into potential portability issues, detecting problematic patterns across many mainstream programming languages. These insights, combined with targeted refactoring, accelerate the process of making code portable, maintainable, and production-ready on Arm. + diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md new file mode 100644 index 0000000000..c7982c5169 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md @@ -0,0 +1,64 @@ +--- +# User change +title: "Supported Programming Languages and Common Issues Identified" + +weight: 3 + +layout: "learningpathall" + +--- + +### migrate-ease + +This is a fork of [Porting advisor](https://github.com/arm-hpc/porting-advisor), an open source project by the Arm engineering team. Migrate-ease is maintained by the [OpenAnolis](https://github.com/openanolis) Arm Working Group. + + +It is an innovative project designed to analyze codebases specifically for x86_64 architectures and offers tailored suggestions aimed at facilitating the migration process to aarch64. +This tool streamlines the transition, ensuring a smooth and efficient evolution of your software to leverage the benefits of aarch64 architecture. +At present, this tool only supports codebase migration to Linux. It can be run on Arm or non-Arm based machines. The tool does not modify any code, it does not provide API level recommendations, and it does not send any data back to OpenAnolis. + +{{% notice Note %}} +Even though Arm software team do our best to identify known incompatibilities, that's still recommend performing appropriate tests on your application before going to Production. +{{% /notice %}} + +### List of Supported Programming Languages + +This tool scans all files in a source tree, regardless of whether they are included by the build system or not. Currently, the tool supports the following languages/dependencies: + +#### C, C++ +- Inline assembly with no corresponding aarch64 inline assembly +- Assembly code with no corresponding aarch64 assembly code +- Use of architecture specific intrinsic +- Use of architecture specific compilation options +- Preprocessor errors that trigger when compiling on aarch64 +- Compiler specific code guarded by compiler specific pre-defined macros +- Missing aarch64 architecture detection in Makefile, Config.guess scripts +- Linking against libraries that are not available on the aarch64 architecture + +#### Go +- Inline assembly with no corresponding aarch64 inline assembly +- Assembly code with no corresponding aarch64 assembly code +- Use of architecture specific intrinsic +- Linking against libraries that are not available on the aarch64 architecture + +#### Python +- Inline assembly with no corresponding aarch64 inline assembly +- Use of architecture specific intrinsic +- Linking against libraries that are not available on the aarch64 architecture +- Use of architecture specific packages + +#### Rust +- Inline assembly with no corresponding aarch64 inline assembly +- Use of architecture specific intrinsic +- Linking against libraries that are not available on the aarch64 architecture + +#### Java +- JAR scanning +- Dependency versions in pom.xml file +- A feature to detect native calls in Java source code +- Compatible version recommendation + +#### Dockerfile +- Use of architecture specific plugin +- The base image that dockfile is based on does not support aarch64 + diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md new file mode 100644 index 0000000000..9e1e6301b9 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md @@ -0,0 +1,77 @@ +--- +# User change +title: "Installing and Running Code Analysis Tools" + +weight: 4 + +layout: "learningpathall" + +--- + +# migrate-ease + +[migrate-ease](https://github.com/migrate-ease/migrate-ease) is an open-source project designed to analyze codebases specifically for x86_64 architectures and offers tailored suggestions aimed at facilitating the migration process to AArch64. This tool streamlines the transition, ensuring a smooth and efficient evolution of your software to leverage the benefits of aarch64 architecture. + +## Pre-requisites +Before you use migrate-ease, certain pre-requesites need to be installed. +{{< tabpane code=true >}} + {{< tab header="Ubuntu/Debian">}} +sudo apt-get install -y python3 python3-pip unzip + {{< /tab >}} + {{< tab header="Fedora">}} +sudo dnf install -y python3 python3-pip unzip + {{< /tab >}} +{{< /tabpane >}} + +## Install and setup +```bash +# Make sure you're at the root directory of migrate-ease +# Enable Python Environment +python3 -m venv .venv +source .venv/bin/activate + +# Check out the project +git clone https://github.com/migrate-ease/migrate-ease + +# Check the project folder +cd migrate-ease + +# install python packages dependencies +pip3 install -r requirements.txt + +# Setup environment +export PYTHONPATH=`pwd` +``` + +## Usage +User can scan a project with a scanner type and the result is sent to console by default. +```bash +python3 -m {scanner_name} --arch {arch} {scan_path} +``` +Scan result can be exported as one of txt, csv, json or html. + +To generate a JSON report: +```bash +python3 -m {scanner_name} --output {result_file_name}.json --arch {arch} {scan_path} +``` + +**Parameters** + +`{scanner_name}`: The name of the scanner, which can be one of cpp, docker, go, java, python, rust. + +`{result_file_name}`: The name of the export result file (without the extension). + +`{arch}`: The architecture type, `aarch64` is the default. + +`{scan_path}`: The path to the code that needs to be scanned. + +User can scan a git repository as well by given the URL. +```bash +python3 -m {scanner_name} --output {result_file_name}.json --arch {arch} --git-repo {repo} {clone_path} +``` +In the case of git repository scan, `{clone_path}` is a directory to hold the cloned code. This directory should be empty or to be created. + +There are more parameters for user to control the scan behaviors. To get these information user can get the built-in help +```bash +python3 -m {scanner_name} -h +``` \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md new file mode 100644 index 0000000000..5440e96e8d --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md @@ -0,0 +1,163 @@ +--- +# User change +title: "Interpreting Analysis Results with a Real Example" + +weight: 5 + +layout: "learningpathall" + +--- +### Example from a real-world case +[Protobuf](https://github.com/protocolbuffers/protobuf) is a widely used library for serializing structured data. AArch64 support is introduced in version v3.5.0 released in November 2017. Version v2.5.0 is a popular version without AArch64 support. + +Use migrate-ease to scan protobuf v2.5.0 with JSON result output: +``` +python3 -m cpp --git-repo https://github.com/protocolbuffers/protobuf.git --branch v2.5.0 --output result.json --arch aarch64 protobuf +``` +A json file, `result.json`, will be generated in current directory once the scan is successfully executed. + +### How to read the result +The JSON result is organized as following format: +```json +{ + "arch": "aarch64", + "branch": "v2.5.0", + "commit": null, + "errors": [], + "file_summary": { + "asm": { + "count": 0, + "fileName": "Assembly", + "loc": 0 + }, + "c": { + "count": 93, + "fileName": "C", + "loc": 29031 + }, + "config.guess": { + "count": 0, + "fileName": "Autoconf", + "loc": 0 + }, + "cpp": { + "count": 113, + "fileName": "CPP", + "loc": 79010 + }, + "makefile": { + "count": 4, + "fileName": "Makefile", + "loc": 719 + } + }, + "git_repo": "https://github.com/protocolbuffers/protobuf.git", + "issue_summary": { + "ArchSpecificLibraryIssue": { + "count": 0, + "des": "Use of libraries strongly tied to the processor architecture, which may lead to compatibility issues." + }, + .... + "PreprocessorErrorIssue": { + "count": 15, + "des": "Target platform may enter the #error preprocessing logic" + }, + "SignedCharIssue": { + "count": 0, + "des": "Compatibility issues with signed char type data" + } + }, + "issue_type_config": null, + "issues": [ + { + "checkpoint": null, + "description": "preprocessor error: #error \"We require at least vs2005 for MemoryBarrier\"", + "filename": "/home/my_repo/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h", + "issue_type": { + "des": "Target platform may enter the #error preprocessing logic.", + "type": "PreprocessorErrorIssue" + }, + "lineno": 46, + "snippet": "namespace google {\nnamespace protobuf {\nnamespace internal {\n\ninline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,\n Atomic32 increment) {\n return Barrier_AtomicIncrement(ptr, increment);\n}\n\n#if !(defined(_MSC_VER) && _MSC_VER >= 1400)\n#error \"We require at least vs2005 for MemoryBarrier\"\n#endif\n\ninline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,\n Atomic32 old_value,\n Atomic32 new_value) {\n return NoBarrier_CompareAndSwap(ptr, old_value, new_value);\n}\n\ninline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,\n Atomic32 old_value,\n" + }, + ... + { + "checkpoint": ".*[= \"]+-O2[ \\n\"]+.*", + "description": "\nWhen the compiler optimization option is set to \"-O2\" level or above, the calculation results of the same floating-point multiplication and addition operation on the x86 platform and the ARM64 platform have differences in the 16 decimal places.\n\nReason:\n\n When the compiler optimization option is set to \"-O2\" level or above on the ARM64 platform, the precision of the floating-point multiplication and addition operation (a+=b*c) can only be accurate to 16 decimal places. When configuring the \"-O2\" option, gcc uses the fused instruction fmadd to complete the multiplication and addition operation instead of fadd and fmul.\n\n fmadd regards the multiplication and addition of floating-point numbers as an inseparable operation and does not round the intermediate results, resulting in different calculation results.\n\nImpact on the system:\n\n When the compiler optimization option is set to \"-O2\" level or above, the performance of floating-point multiplication and addition operations is improved, but the accuracy of the operation is affected.\n\nSolution:\n\n Add the compilation option \"-ffp-contract=off\" This optimization can be turned off.\n\n", + "filename": "protobuf/more_tests/Makefile", + "issue_type": { + "des": "Potential compatibility issues related to the compilation build commands", + "type": "BuildCommandIssue" + }, + "lineno": 40, + "snippet": "\t(cd src && make install)\n\n# Verify that headers produce no warnings even under strict settings.\nheader_warning_test.cc: target\n\t( (cd target/include && find google/protobuf -name '*.h') | \\\n\t awk '{print \"#include \\\"\"$$1\"\\\"\"} ' > header_warning_test.cc )\n\nheader_warning_test: header_warning_test.cc\n\t# TODO(kenton): Consider adding -pedantic and -Weffc++. Currently these\n\t# produce tons of extra warnings so we'll need to do some work first.\n\tg++ -Itarget/include -Wall -Werror -Wsign-compare -O2 -c header_warning_test.cc\n", + "target": null + } + ], + "language_type": "cpp", + "march": null, + "output": null, + "progress": true, + "quiet": false, + "remarks": [], + "root_directory": "protobuf", + "source_dirs": [ + "protobuf/src/google/protobuf/compiler/cpp", + ... + ], + "source_files": [ + "protobuf/Makefile.am", + ... + ], + "target_os": "OpenAnolis", + "total_issue_count": 14 +} +``` +The items in result are well self-explained along with their keys. +User needs to check `issue_summary` and `issues` to uncover what potential problems are and suggested solutions. + +The `issue_summary` provides an overview of the types of issues that the current scanner supports, along with the corresponding number of issues. For `cpp` scanner, the available issue types are: + +For each of programming Languages, the available issue types are: +{{< tabpane code=true >}} + {{< tab header="C++, C">}} + ArchSpecificLibrary + AsmSource + Avx256Intrinsic + Avx512Intrinsic + BuildCommand + CompilerSpecific + ConfigGuess + CrossCompile + DefineOtherArch + HostCpuDetection + InlineAsm + Intrinsic + NoEquivalent + NoEquivalentInlineAsm + NoEquivalentIntrinsic + OldCrt + PragmaSimd + PreprocessorError + {{< /tab >}} + {{< tab header="Go">}} + {{< /tab >}} + {{< tab header="Python">}} + {{< /tab >}} + {{< tab header="Rust">}} + {{< /tab >}} + {{< tab header="Java">}} + {{< /tab >}} + {{< tab header="Dockerfile">}} + {{< /tab >}} +{{< /tabpane >}} + +The `issues` is a list of those detected issues with details for each of them. +- `checkpoint`: A pattern to identify potential incompatibility. +- `description`: The description of the detected issue. +- `filename`: The file in which issue is detected. +- `issue_type`: The type of issue, including detailed descriptions of the error. +- `lineno`: The line number of the problematic code. +- `snippet`: The block of the problematic code. + +For more information about issue type information perf review [migrate-ease github](https://github.com/migrate-ease/migrate-ease/blob/main/README.md). diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md new file mode 100644 index 0000000000..2a57721ae6 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md @@ -0,0 +1,60 @@ +--- +title: Accelerating Application Migration to Arm Servers Using Code Scanning Tools + +minutes_to_complete: 45 + +who_is_this_for: This is an automated tool introductory for software developers and DevOps engineers who are preparing to migrate existing applications to Arm-based server environments. It introduces a static analysis tool (migrate-ease) that simplifies the process by identifying portability challenges early. + + +learning_objectives: + - Set up an Arm development machine + - Analyze application source code for architecture-specific dependencies + - Understand common migration challenges and solutions + - Use migrate-ease to identify and prioritize portability issues + +prerequisites: + - An [Arm based instance](/learning-paths/servers-and-cloud-computing/csp/) from a cloud service provider. + +author: + - Odin Shen + - Jun He + +### Tags +skilllevels: Introductory +subjects: Libraries +armips: + - Neoverse +operatingsystems: + - Linux +tools_software_languages: + - Coding + - Neon + - SVE + - Go + - Runbook + +further_reading: + - resource: + title: AWS Graviton Getting Started + link: https://github.com/aws/aws-graviton-getting-started + type: documentation + - resource: + title: AWS Graviton Processors + link: https://dev.to/aws-builders/aws-graviton-processors-3nk3 + type: blog + - resource: + title: Arm Cloud Migration Program + link: https://www.arm.com/markets/computing-infrastructure/arm-cloud-migration + type: website + - resource: + title: Migrating applications to Arm servers + link: https://learn.arm.com/learning-paths/servers-and-cloud-computing/migration/ + type: website + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- From d1596e837c379b37ea70fc7ba1e74c7b660a012a Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Wed, 7 May 2025 14:09:28 +0100 Subject: [PATCH 2/8] Clear up files --- .../migrate-ease/1_CodeScanning.md | 30 ---- .../migrate-ease/2_migrate_ease_spec.md | 64 ------- .../migrate-ease/3_migrate_ease_run.md | 77 --------- .../migrate-ease/4_migrate_ease_analysis.md | 163 ------------------ .../migrate-ease/_index.md | 60 ------- .../migrate-ease/_next-steps.md | 8 - 6 files changed, 402 deletions(-) delete mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md delete mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md delete mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md delete mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md delete mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md delete mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md deleted file mode 100644 index 3c1d358054..0000000000 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -# User change -title: "Why Code Scanning Matters for Arm Migration" - -weight: 2 - -layout: "learningpathall" - ---- - -### Overview of the Common Arm Migration Challenge - -Migrating applications to Arm-based architectures is increasingly common across cloud, data center, and edge environments. Arm-powered servers and instances, such as AWS Graviton processors or Ampere Altra-based systems available on platforms like Google Cloud Platform, Microsoft Azure, Alibaba Cloud and Oracle Cloud Infrastructure (OCI), deliver significant performance-per-watt advantages and compelling cost-efficiency. - -However, porting workloads to new CPU architecture often involves more than just recompiling. While many applications transition smoothly, others contain architecture-specific code or dependencies – developed originally for x86 – that can lead to build failures, runtime errors, or performance degradation on Arm systems. - -Common challenges include detecting: -* Hardcoded x86 SIMD intrinsics -* Inline assembly -* Platform-specific system calls -* Unsupported compiler flags -* Non-portable build scripts or logic - -In large or legacy codebases, these issues are often buried in third-party libraries or auto-generated components, making manual inspection slow and unreliable. - -### Automated Analysis for Portability -To address these challenges proactively, automated static analysis tools play a critical role. Tools specifically designed for portability analysis enable developers to scan local codebases or remote repositories (e.g., GitHub) —and pinpoint architecture-specific constructs before attempting compilation or deployment on Arm. By surfacing portability concerns early in the development cycle, code scanning reduces time-to-first-build and helps prevent complex failures later. - -In this learning path, we will introduce `migrate-ease`, a tool which allows developers to move beyond trial-and-error debugging. It provides clear, actionable insights into potential portability issues, detecting problematic patterns across many mainstream programming languages. These insights, combined with targeted refactoring, accelerate the process of making code portable, maintainable, and production-ready on Arm. - diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md deleted file mode 100644 index c7982c5169..0000000000 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -# User change -title: "Supported Programming Languages and Common Issues Identified" - -weight: 3 - -layout: "learningpathall" - ---- - -### migrate-ease - -This is a fork of [Porting advisor](https://github.com/arm-hpc/porting-advisor), an open source project by the Arm engineering team. Migrate-ease is maintained by the [OpenAnolis](https://github.com/openanolis) Arm Working Group. - - -It is an innovative project designed to analyze codebases specifically for x86_64 architectures and offers tailored suggestions aimed at facilitating the migration process to aarch64. -This tool streamlines the transition, ensuring a smooth and efficient evolution of your software to leverage the benefits of aarch64 architecture. -At present, this tool only supports codebase migration to Linux. It can be run on Arm or non-Arm based machines. The tool does not modify any code, it does not provide API level recommendations, and it does not send any data back to OpenAnolis. - -{{% notice Note %}} -Even though Arm software team do our best to identify known incompatibilities, that's still recommend performing appropriate tests on your application before going to Production. -{{% /notice %}} - -### List of Supported Programming Languages - -This tool scans all files in a source tree, regardless of whether they are included by the build system or not. Currently, the tool supports the following languages/dependencies: - -#### C, C++ -- Inline assembly with no corresponding aarch64 inline assembly -- Assembly code with no corresponding aarch64 assembly code -- Use of architecture specific intrinsic -- Use of architecture specific compilation options -- Preprocessor errors that trigger when compiling on aarch64 -- Compiler specific code guarded by compiler specific pre-defined macros -- Missing aarch64 architecture detection in Makefile, Config.guess scripts -- Linking against libraries that are not available on the aarch64 architecture - -#### Go -- Inline assembly with no corresponding aarch64 inline assembly -- Assembly code with no corresponding aarch64 assembly code -- Use of architecture specific intrinsic -- Linking against libraries that are not available on the aarch64 architecture - -#### Python -- Inline assembly with no corresponding aarch64 inline assembly -- Use of architecture specific intrinsic -- Linking against libraries that are not available on the aarch64 architecture -- Use of architecture specific packages - -#### Rust -- Inline assembly with no corresponding aarch64 inline assembly -- Use of architecture specific intrinsic -- Linking against libraries that are not available on the aarch64 architecture - -#### Java -- JAR scanning -- Dependency versions in pom.xml file -- A feature to detect native calls in Java source code -- Compatible version recommendation - -#### Dockerfile -- Use of architecture specific plugin -- The base image that dockfile is based on does not support aarch64 - diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md deleted file mode 100644 index 9e1e6301b9..0000000000 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -# User change -title: "Installing and Running Code Analysis Tools" - -weight: 4 - -layout: "learningpathall" - ---- - -# migrate-ease - -[migrate-ease](https://github.com/migrate-ease/migrate-ease) is an open-source project designed to analyze codebases specifically for x86_64 architectures and offers tailored suggestions aimed at facilitating the migration process to AArch64. This tool streamlines the transition, ensuring a smooth and efficient evolution of your software to leverage the benefits of aarch64 architecture. - -## Pre-requisites -Before you use migrate-ease, certain pre-requesites need to be installed. -{{< tabpane code=true >}} - {{< tab header="Ubuntu/Debian">}} -sudo apt-get install -y python3 python3-pip unzip - {{< /tab >}} - {{< tab header="Fedora">}} -sudo dnf install -y python3 python3-pip unzip - {{< /tab >}} -{{< /tabpane >}} - -## Install and setup -```bash -# Make sure you're at the root directory of migrate-ease -# Enable Python Environment -python3 -m venv .venv -source .venv/bin/activate - -# Check out the project -git clone https://github.com/migrate-ease/migrate-ease - -# Check the project folder -cd migrate-ease - -# install python packages dependencies -pip3 install -r requirements.txt - -# Setup environment -export PYTHONPATH=`pwd` -``` - -## Usage -User can scan a project with a scanner type and the result is sent to console by default. -```bash -python3 -m {scanner_name} --arch {arch} {scan_path} -``` -Scan result can be exported as one of txt, csv, json or html. - -To generate a JSON report: -```bash -python3 -m {scanner_name} --output {result_file_name}.json --arch {arch} {scan_path} -``` - -**Parameters** - -`{scanner_name}`: The name of the scanner, which can be one of cpp, docker, go, java, python, rust. - -`{result_file_name}`: The name of the export result file (without the extension). - -`{arch}`: The architecture type, `aarch64` is the default. - -`{scan_path}`: The path to the code that needs to be scanned. - -User can scan a git repository as well by given the URL. -```bash -python3 -m {scanner_name} --output {result_file_name}.json --arch {arch} --git-repo {repo} {clone_path} -``` -In the case of git repository scan, `{clone_path}` is a directory to hold the cloned code. This directory should be empty or to be created. - -There are more parameters for user to control the scan behaviors. To get these information user can get the built-in help -```bash -python3 -m {scanner_name} -h -``` \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md deleted file mode 100644 index 5440e96e8d..0000000000 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -# User change -title: "Interpreting Analysis Results with a Real Example" - -weight: 5 - -layout: "learningpathall" - ---- -### Example from a real-world case -[Protobuf](https://github.com/protocolbuffers/protobuf) is a widely used library for serializing structured data. AArch64 support is introduced in version v3.5.0 released in November 2017. Version v2.5.0 is a popular version without AArch64 support. - -Use migrate-ease to scan protobuf v2.5.0 with JSON result output: -``` -python3 -m cpp --git-repo https://github.com/protocolbuffers/protobuf.git --branch v2.5.0 --output result.json --arch aarch64 protobuf -``` -A json file, `result.json`, will be generated in current directory once the scan is successfully executed. - -### How to read the result -The JSON result is organized as following format: -```json -{ - "arch": "aarch64", - "branch": "v2.5.0", - "commit": null, - "errors": [], - "file_summary": { - "asm": { - "count": 0, - "fileName": "Assembly", - "loc": 0 - }, - "c": { - "count": 93, - "fileName": "C", - "loc": 29031 - }, - "config.guess": { - "count": 0, - "fileName": "Autoconf", - "loc": 0 - }, - "cpp": { - "count": 113, - "fileName": "CPP", - "loc": 79010 - }, - "makefile": { - "count": 4, - "fileName": "Makefile", - "loc": 719 - } - }, - "git_repo": "https://github.com/protocolbuffers/protobuf.git", - "issue_summary": { - "ArchSpecificLibraryIssue": { - "count": 0, - "des": "Use of libraries strongly tied to the processor architecture, which may lead to compatibility issues." - }, - .... - "PreprocessorErrorIssue": { - "count": 15, - "des": "Target platform may enter the #error preprocessing logic" - }, - "SignedCharIssue": { - "count": 0, - "des": "Compatibility issues with signed char type data" - } - }, - "issue_type_config": null, - "issues": [ - { - "checkpoint": null, - "description": "preprocessor error: #error \"We require at least vs2005 for MemoryBarrier\"", - "filename": "/home/my_repo/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h", - "issue_type": { - "des": "Target platform may enter the #error preprocessing logic.", - "type": "PreprocessorErrorIssue" - }, - "lineno": 46, - "snippet": "namespace google {\nnamespace protobuf {\nnamespace internal {\n\ninline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,\n Atomic32 increment) {\n return Barrier_AtomicIncrement(ptr, increment);\n}\n\n#if !(defined(_MSC_VER) && _MSC_VER >= 1400)\n#error \"We require at least vs2005 for MemoryBarrier\"\n#endif\n\ninline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,\n Atomic32 old_value,\n Atomic32 new_value) {\n return NoBarrier_CompareAndSwap(ptr, old_value, new_value);\n}\n\ninline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,\n Atomic32 old_value,\n" - }, - ... - { - "checkpoint": ".*[= \"]+-O2[ \\n\"]+.*", - "description": "\nWhen the compiler optimization option is set to \"-O2\" level or above, the calculation results of the same floating-point multiplication and addition operation on the x86 platform and the ARM64 platform have differences in the 16 decimal places.\n\nReason:\n\n When the compiler optimization option is set to \"-O2\" level or above on the ARM64 platform, the precision of the floating-point multiplication and addition operation (a+=b*c) can only be accurate to 16 decimal places. When configuring the \"-O2\" option, gcc uses the fused instruction fmadd to complete the multiplication and addition operation instead of fadd and fmul.\n\n fmadd regards the multiplication and addition of floating-point numbers as an inseparable operation and does not round the intermediate results, resulting in different calculation results.\n\nImpact on the system:\n\n When the compiler optimization option is set to \"-O2\" level or above, the performance of floating-point multiplication and addition operations is improved, but the accuracy of the operation is affected.\n\nSolution:\n\n Add the compilation option \"-ffp-contract=off\" This optimization can be turned off.\n\n", - "filename": "protobuf/more_tests/Makefile", - "issue_type": { - "des": "Potential compatibility issues related to the compilation build commands", - "type": "BuildCommandIssue" - }, - "lineno": 40, - "snippet": "\t(cd src && make install)\n\n# Verify that headers produce no warnings even under strict settings.\nheader_warning_test.cc: target\n\t( (cd target/include && find google/protobuf -name '*.h') | \\\n\t awk '{print \"#include \\\"\"$$1\"\\\"\"} ' > header_warning_test.cc )\n\nheader_warning_test: header_warning_test.cc\n\t# TODO(kenton): Consider adding -pedantic and -Weffc++. Currently these\n\t# produce tons of extra warnings so we'll need to do some work first.\n\tg++ -Itarget/include -Wall -Werror -Wsign-compare -O2 -c header_warning_test.cc\n", - "target": null - } - ], - "language_type": "cpp", - "march": null, - "output": null, - "progress": true, - "quiet": false, - "remarks": [], - "root_directory": "protobuf", - "source_dirs": [ - "protobuf/src/google/protobuf/compiler/cpp", - ... - ], - "source_files": [ - "protobuf/Makefile.am", - ... - ], - "target_os": "OpenAnolis", - "total_issue_count": 14 -} -``` -The items in result are well self-explained along with their keys. -User needs to check `issue_summary` and `issues` to uncover what potential problems are and suggested solutions. - -The `issue_summary` provides an overview of the types of issues that the current scanner supports, along with the corresponding number of issues. For `cpp` scanner, the available issue types are: - -For each of programming Languages, the available issue types are: -{{< tabpane code=true >}} - {{< tab header="C++, C">}} - ArchSpecificLibrary - AsmSource - Avx256Intrinsic - Avx512Intrinsic - BuildCommand - CompilerSpecific - ConfigGuess - CrossCompile - DefineOtherArch - HostCpuDetection - InlineAsm - Intrinsic - NoEquivalent - NoEquivalentInlineAsm - NoEquivalentIntrinsic - OldCrt - PragmaSimd - PreprocessorError - {{< /tab >}} - {{< tab header="Go">}} - {{< /tab >}} - {{< tab header="Python">}} - {{< /tab >}} - {{< tab header="Rust">}} - {{< /tab >}} - {{< tab header="Java">}} - {{< /tab >}} - {{< tab header="Dockerfile">}} - {{< /tab >}} -{{< /tabpane >}} - -The `issues` is a list of those detected issues with details for each of them. -- `checkpoint`: A pattern to identify potential incompatibility. -- `description`: The description of the detected issue. -- `filename`: The file in which issue is detected. -- `issue_type`: The type of issue, including detailed descriptions of the error. -- `lineno`: The line number of the problematic code. -- `snippet`: The block of the problematic code. - -For more information about issue type information perf review [migrate-ease github](https://github.com/migrate-ease/migrate-ease/blob/main/README.md). diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md deleted file mode 100644 index 2a57721ae6..0000000000 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Accelerating Application Migration to Arm Servers Using Code Scanning Tools - -minutes_to_complete: 45 - -who_is_this_for: This is an automated tool introductory for software developers and DevOps engineers who are preparing to migrate existing applications to Arm-based server environments. It introduces a static analysis tool (migrate-ease) that simplifies the process by identifying portability challenges early. - - -learning_objectives: - - Set up an Arm development machine - - Analyze application source code for architecture-specific dependencies - - Understand common migration challenges and solutions - - Use migrate-ease to identify and prioritize portability issues - -prerequisites: - - An [Arm based instance](/learning-paths/servers-and-cloud-computing/csp/) from a cloud service provider. - -author: - - Odin Shen - - Jun He - -### Tags -skilllevels: Introductory -subjects: Libraries -armips: - - Neoverse -operatingsystems: - - Linux -tools_software_languages: - - Coding - - Neon - - SVE - - Go - - Runbook - -further_reading: - - resource: - title: AWS Graviton Getting Started - link: https://github.com/aws/aws-graviton-getting-started - type: documentation - - resource: - title: AWS Graviton Processors - link: https://dev.to/aws-builders/aws-graviton-processors-3nk3 - type: blog - - resource: - title: Arm Cloud Migration Program - link: https://www.arm.com/markets/computing-infrastructure/arm-cloud-migration - type: website - - resource: - title: Migrating applications to Arm servers - link: https://learn.arm.com/learning-paths/servers-and-cloud-computing/migration/ - type: website - - -### FIXED, DO NOT MODIFY -# ================================================================================ -weight: 1 # _index.md always has weight of 1 to order correctly -layout: "learningpathall" # All files under learning paths have this same wrapper -learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. ---- diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md deleted file mode 100644 index c3db0de5a2..0000000000 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -# ================================================================================ -# FIXED, DO NOT MODIFY THIS FILE -# ================================================================================ -weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. -title: "Next Steps" # Always the same, html page title. -layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. ---- From b495fdc7a43bb88e4ddf2215745193191c3f6659 Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Wed, 7 May 2025 14:13:04 +0100 Subject: [PATCH 3/8] Clear up contributor --- assets/contributors.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/contributors.csv b/assets/contributors.csv index 4116c50c9e..9d0c9b4b95 100644 --- a/assets/contributors.csv +++ b/assets/contributors.csv @@ -85,4 +85,3 @@ Yiyang Fan,Arm,,,, Julien Jayat,Arm,,,, Geremy Cohen,Arm,geremyCohen,geremyinanutshell,, Barbara Corriero,Arm,,,, -Jun He, Arm,,,, From 98068b983be5e848c52845f473c44337a687425c Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Wed, 7 May 2025 14:15:06 +0100 Subject: [PATCH 4/8] Initial new migrate-ease LP Add migrate-ease learning path and put Jun He into contributors list. --- assets/contributors.csv | 1 + .../migrate-ease/1_CodeScanning.md | 30 ++++ .../migrate-ease/2_migrate_ease_spec.md | 64 +++++++ .../migrate-ease/3_migrate_ease_run.md | 77 +++++++++ .../migrate-ease/4_migrate_ease_analysis.md | 163 ++++++++++++++++++ .../migrate-ease/_index.md | 60 +++++++ .../migrate-ease/_next-steps.md | 8 + 7 files changed, 403 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md diff --git a/assets/contributors.csv b/assets/contributors.csv index 9d0c9b4b95..4116c50c9e 100644 --- a/assets/contributors.csv +++ b/assets/contributors.csv @@ -85,3 +85,4 @@ Yiyang Fan,Arm,,,, Julien Jayat,Arm,,,, Geremy Cohen,Arm,geremyCohen,geremyinanutshell,, Barbara Corriero,Arm,,,, +Jun He, Arm,,,, diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md new file mode 100644 index 0000000000..3c1d358054 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md @@ -0,0 +1,30 @@ +--- +# User change +title: "Why Code Scanning Matters for Arm Migration" + +weight: 2 + +layout: "learningpathall" + +--- + +### Overview of the Common Arm Migration Challenge + +Migrating applications to Arm-based architectures is increasingly common across cloud, data center, and edge environments. Arm-powered servers and instances, such as AWS Graviton processors or Ampere Altra-based systems available on platforms like Google Cloud Platform, Microsoft Azure, Alibaba Cloud and Oracle Cloud Infrastructure (OCI), deliver significant performance-per-watt advantages and compelling cost-efficiency. + +However, porting workloads to new CPU architecture often involves more than just recompiling. While many applications transition smoothly, others contain architecture-specific code or dependencies – developed originally for x86 – that can lead to build failures, runtime errors, or performance degradation on Arm systems. + +Common challenges include detecting: +* Hardcoded x86 SIMD intrinsics +* Inline assembly +* Platform-specific system calls +* Unsupported compiler flags +* Non-portable build scripts or logic + +In large or legacy codebases, these issues are often buried in third-party libraries or auto-generated components, making manual inspection slow and unreliable. + +### Automated Analysis for Portability +To address these challenges proactively, automated static analysis tools play a critical role. Tools specifically designed for portability analysis enable developers to scan local codebases or remote repositories (e.g., GitHub) —and pinpoint architecture-specific constructs before attempting compilation or deployment on Arm. By surfacing portability concerns early in the development cycle, code scanning reduces time-to-first-build and helps prevent complex failures later. + +In this learning path, we will introduce `migrate-ease`, a tool which allows developers to move beyond trial-and-error debugging. It provides clear, actionable insights into potential portability issues, detecting problematic patterns across many mainstream programming languages. These insights, combined with targeted refactoring, accelerate the process of making code portable, maintainable, and production-ready on Arm. + diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md new file mode 100644 index 0000000000..c7982c5169 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md @@ -0,0 +1,64 @@ +--- +# User change +title: "Supported Programming Languages and Common Issues Identified" + +weight: 3 + +layout: "learningpathall" + +--- + +### migrate-ease + +This is a fork of [Porting advisor](https://github.com/arm-hpc/porting-advisor), an open source project by the Arm engineering team. Migrate-ease is maintained by the [OpenAnolis](https://github.com/openanolis) Arm Working Group. + + +It is an innovative project designed to analyze codebases specifically for x86_64 architectures and offers tailored suggestions aimed at facilitating the migration process to aarch64. +This tool streamlines the transition, ensuring a smooth and efficient evolution of your software to leverage the benefits of aarch64 architecture. +At present, this tool only supports codebase migration to Linux. It can be run on Arm or non-Arm based machines. The tool does not modify any code, it does not provide API level recommendations, and it does not send any data back to OpenAnolis. + +{{% notice Note %}} +Even though Arm software team do our best to identify known incompatibilities, that's still recommend performing appropriate tests on your application before going to Production. +{{% /notice %}} + +### List of Supported Programming Languages + +This tool scans all files in a source tree, regardless of whether they are included by the build system or not. Currently, the tool supports the following languages/dependencies: + +#### C, C++ +- Inline assembly with no corresponding aarch64 inline assembly +- Assembly code with no corresponding aarch64 assembly code +- Use of architecture specific intrinsic +- Use of architecture specific compilation options +- Preprocessor errors that trigger when compiling on aarch64 +- Compiler specific code guarded by compiler specific pre-defined macros +- Missing aarch64 architecture detection in Makefile, Config.guess scripts +- Linking against libraries that are not available on the aarch64 architecture + +#### Go +- Inline assembly with no corresponding aarch64 inline assembly +- Assembly code with no corresponding aarch64 assembly code +- Use of architecture specific intrinsic +- Linking against libraries that are not available on the aarch64 architecture + +#### Python +- Inline assembly with no corresponding aarch64 inline assembly +- Use of architecture specific intrinsic +- Linking against libraries that are not available on the aarch64 architecture +- Use of architecture specific packages + +#### Rust +- Inline assembly with no corresponding aarch64 inline assembly +- Use of architecture specific intrinsic +- Linking against libraries that are not available on the aarch64 architecture + +#### Java +- JAR scanning +- Dependency versions in pom.xml file +- A feature to detect native calls in Java source code +- Compatible version recommendation + +#### Dockerfile +- Use of architecture specific plugin +- The base image that dockfile is based on does not support aarch64 + diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md new file mode 100644 index 0000000000..9e1e6301b9 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md @@ -0,0 +1,77 @@ +--- +# User change +title: "Installing and Running Code Analysis Tools" + +weight: 4 + +layout: "learningpathall" + +--- + +# migrate-ease + +[migrate-ease](https://github.com/migrate-ease/migrate-ease) is an open-source project designed to analyze codebases specifically for x86_64 architectures and offers tailored suggestions aimed at facilitating the migration process to AArch64. This tool streamlines the transition, ensuring a smooth and efficient evolution of your software to leverage the benefits of aarch64 architecture. + +## Pre-requisites +Before you use migrate-ease, certain pre-requesites need to be installed. +{{< tabpane code=true >}} + {{< tab header="Ubuntu/Debian">}} +sudo apt-get install -y python3 python3-pip unzip + {{< /tab >}} + {{< tab header="Fedora">}} +sudo dnf install -y python3 python3-pip unzip + {{< /tab >}} +{{< /tabpane >}} + +## Install and setup +```bash +# Make sure you're at the root directory of migrate-ease +# Enable Python Environment +python3 -m venv .venv +source .venv/bin/activate + +# Check out the project +git clone https://github.com/migrate-ease/migrate-ease + +# Check the project folder +cd migrate-ease + +# install python packages dependencies +pip3 install -r requirements.txt + +# Setup environment +export PYTHONPATH=`pwd` +``` + +## Usage +User can scan a project with a scanner type and the result is sent to console by default. +```bash +python3 -m {scanner_name} --arch {arch} {scan_path} +``` +Scan result can be exported as one of txt, csv, json or html. + +To generate a JSON report: +```bash +python3 -m {scanner_name} --output {result_file_name}.json --arch {arch} {scan_path} +``` + +**Parameters** + +`{scanner_name}`: The name of the scanner, which can be one of cpp, docker, go, java, python, rust. + +`{result_file_name}`: The name of the export result file (without the extension). + +`{arch}`: The architecture type, `aarch64` is the default. + +`{scan_path}`: The path to the code that needs to be scanned. + +User can scan a git repository as well by given the URL. +```bash +python3 -m {scanner_name} --output {result_file_name}.json --arch {arch} --git-repo {repo} {clone_path} +``` +In the case of git repository scan, `{clone_path}` is a directory to hold the cloned code. This directory should be empty or to be created. + +There are more parameters for user to control the scan behaviors. To get these information user can get the built-in help +```bash +python3 -m {scanner_name} -h +``` \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md new file mode 100644 index 0000000000..5440e96e8d --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md @@ -0,0 +1,163 @@ +--- +# User change +title: "Interpreting Analysis Results with a Real Example" + +weight: 5 + +layout: "learningpathall" + +--- +### Example from a real-world case +[Protobuf](https://github.com/protocolbuffers/protobuf) is a widely used library for serializing structured data. AArch64 support is introduced in version v3.5.0 released in November 2017. Version v2.5.0 is a popular version without AArch64 support. + +Use migrate-ease to scan protobuf v2.5.0 with JSON result output: +``` +python3 -m cpp --git-repo https://github.com/protocolbuffers/protobuf.git --branch v2.5.0 --output result.json --arch aarch64 protobuf +``` +A json file, `result.json`, will be generated in current directory once the scan is successfully executed. + +### How to read the result +The JSON result is organized as following format: +```json +{ + "arch": "aarch64", + "branch": "v2.5.0", + "commit": null, + "errors": [], + "file_summary": { + "asm": { + "count": 0, + "fileName": "Assembly", + "loc": 0 + }, + "c": { + "count": 93, + "fileName": "C", + "loc": 29031 + }, + "config.guess": { + "count": 0, + "fileName": "Autoconf", + "loc": 0 + }, + "cpp": { + "count": 113, + "fileName": "CPP", + "loc": 79010 + }, + "makefile": { + "count": 4, + "fileName": "Makefile", + "loc": 719 + } + }, + "git_repo": "https://github.com/protocolbuffers/protobuf.git", + "issue_summary": { + "ArchSpecificLibraryIssue": { + "count": 0, + "des": "Use of libraries strongly tied to the processor architecture, which may lead to compatibility issues." + }, + .... + "PreprocessorErrorIssue": { + "count": 15, + "des": "Target platform may enter the #error preprocessing logic" + }, + "SignedCharIssue": { + "count": 0, + "des": "Compatibility issues with signed char type data" + } + }, + "issue_type_config": null, + "issues": [ + { + "checkpoint": null, + "description": "preprocessor error: #error \"We require at least vs2005 for MemoryBarrier\"", + "filename": "/home/my_repo/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h", + "issue_type": { + "des": "Target platform may enter the #error preprocessing logic.", + "type": "PreprocessorErrorIssue" + }, + "lineno": 46, + "snippet": "namespace google {\nnamespace protobuf {\nnamespace internal {\n\ninline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,\n Atomic32 increment) {\n return Barrier_AtomicIncrement(ptr, increment);\n}\n\n#if !(defined(_MSC_VER) && _MSC_VER >= 1400)\n#error \"We require at least vs2005 for MemoryBarrier\"\n#endif\n\ninline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,\n Atomic32 old_value,\n Atomic32 new_value) {\n return NoBarrier_CompareAndSwap(ptr, old_value, new_value);\n}\n\ninline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,\n Atomic32 old_value,\n" + }, + ... + { + "checkpoint": ".*[= \"]+-O2[ \\n\"]+.*", + "description": "\nWhen the compiler optimization option is set to \"-O2\" level or above, the calculation results of the same floating-point multiplication and addition operation on the x86 platform and the ARM64 platform have differences in the 16 decimal places.\n\nReason:\n\n When the compiler optimization option is set to \"-O2\" level or above on the ARM64 platform, the precision of the floating-point multiplication and addition operation (a+=b*c) can only be accurate to 16 decimal places. When configuring the \"-O2\" option, gcc uses the fused instruction fmadd to complete the multiplication and addition operation instead of fadd and fmul.\n\n fmadd regards the multiplication and addition of floating-point numbers as an inseparable operation and does not round the intermediate results, resulting in different calculation results.\n\nImpact on the system:\n\n When the compiler optimization option is set to \"-O2\" level or above, the performance of floating-point multiplication and addition operations is improved, but the accuracy of the operation is affected.\n\nSolution:\n\n Add the compilation option \"-ffp-contract=off\" This optimization can be turned off.\n\n", + "filename": "protobuf/more_tests/Makefile", + "issue_type": { + "des": "Potential compatibility issues related to the compilation build commands", + "type": "BuildCommandIssue" + }, + "lineno": 40, + "snippet": "\t(cd src && make install)\n\n# Verify that headers produce no warnings even under strict settings.\nheader_warning_test.cc: target\n\t( (cd target/include && find google/protobuf -name '*.h') | \\\n\t awk '{print \"#include \\\"\"$$1\"\\\"\"} ' > header_warning_test.cc )\n\nheader_warning_test: header_warning_test.cc\n\t# TODO(kenton): Consider adding -pedantic and -Weffc++. Currently these\n\t# produce tons of extra warnings so we'll need to do some work first.\n\tg++ -Itarget/include -Wall -Werror -Wsign-compare -O2 -c header_warning_test.cc\n", + "target": null + } + ], + "language_type": "cpp", + "march": null, + "output": null, + "progress": true, + "quiet": false, + "remarks": [], + "root_directory": "protobuf", + "source_dirs": [ + "protobuf/src/google/protobuf/compiler/cpp", + ... + ], + "source_files": [ + "protobuf/Makefile.am", + ... + ], + "target_os": "OpenAnolis", + "total_issue_count": 14 +} +``` +The items in result are well self-explained along with their keys. +User needs to check `issue_summary` and `issues` to uncover what potential problems are and suggested solutions. + +The `issue_summary` provides an overview of the types of issues that the current scanner supports, along with the corresponding number of issues. For `cpp` scanner, the available issue types are: + +For each of programming Languages, the available issue types are: +{{< tabpane code=true >}} + {{< tab header="C++, C">}} + ArchSpecificLibrary + AsmSource + Avx256Intrinsic + Avx512Intrinsic + BuildCommand + CompilerSpecific + ConfigGuess + CrossCompile + DefineOtherArch + HostCpuDetection + InlineAsm + Intrinsic + NoEquivalent + NoEquivalentInlineAsm + NoEquivalentIntrinsic + OldCrt + PragmaSimd + PreprocessorError + {{< /tab >}} + {{< tab header="Go">}} + {{< /tab >}} + {{< tab header="Python">}} + {{< /tab >}} + {{< tab header="Rust">}} + {{< /tab >}} + {{< tab header="Java">}} + {{< /tab >}} + {{< tab header="Dockerfile">}} + {{< /tab >}} +{{< /tabpane >}} + +The `issues` is a list of those detected issues with details for each of them. +- `checkpoint`: A pattern to identify potential incompatibility. +- `description`: The description of the detected issue. +- `filename`: The file in which issue is detected. +- `issue_type`: The type of issue, including detailed descriptions of the error. +- `lineno`: The line number of the problematic code. +- `snippet`: The block of the problematic code. + +For more information about issue type information perf review [migrate-ease github](https://github.com/migrate-ease/migrate-ease/blob/main/README.md). diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md new file mode 100644 index 0000000000..2a57721ae6 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_index.md @@ -0,0 +1,60 @@ +--- +title: Accelerating Application Migration to Arm Servers Using Code Scanning Tools + +minutes_to_complete: 45 + +who_is_this_for: This is an automated tool introductory for software developers and DevOps engineers who are preparing to migrate existing applications to Arm-based server environments. It introduces a static analysis tool (migrate-ease) that simplifies the process by identifying portability challenges early. + + +learning_objectives: + - Set up an Arm development machine + - Analyze application source code for architecture-specific dependencies + - Understand common migration challenges and solutions + - Use migrate-ease to identify and prioritize portability issues + +prerequisites: + - An [Arm based instance](/learning-paths/servers-and-cloud-computing/csp/) from a cloud service provider. + +author: + - Odin Shen + - Jun He + +### Tags +skilllevels: Introductory +subjects: Libraries +armips: + - Neoverse +operatingsystems: + - Linux +tools_software_languages: + - Coding + - Neon + - SVE + - Go + - Runbook + +further_reading: + - resource: + title: AWS Graviton Getting Started + link: https://github.com/aws/aws-graviton-getting-started + type: documentation + - resource: + title: AWS Graviton Processors + link: https://dev.to/aws-builders/aws-graviton-processors-3nk3 + type: blog + - resource: + title: Arm Cloud Migration Program + link: https://www.arm.com/markets/computing-infrastructure/arm-cloud-migration + type: website + - resource: + title: Migrating applications to Arm servers + link: https://learn.arm.com/learning-paths/servers-and-cloud-computing/migration/ + type: website + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- From 3143829fb42a08aa1dd97586cbb6f34940ba09a0 Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Wed, 7 May 2025 17:39:40 +0100 Subject: [PATCH 5/8] To prevent readers from directly copying non-useful JSON example output. --- .../migrate-ease/4_migrate_ease_analysis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md index 5440e96e8d..f6b2aacc71 100644 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md @@ -18,7 +18,7 @@ A json file, `result.json`, will be generated in current directory once the scan ### How to read the result The JSON result is organized as following format: -```json +```output { "arch": "aarch64", "branch": "v2.5.0", From c4aa62adba9e243f3824e7c7d735b03c1a5d3f5a Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Fri, 9 May 2025 11:33:13 +0100 Subject: [PATCH 6/8] Add migrate-ease repo, detect issue type and description. --- assets/contributors.csv | 2 +- .../migrate-ease/2_migrate_ease_spec.md | 2 +- .../migrate-ease/3_migrate_ease_run.md | 21 +++--- .../migrate-ease/4_migrate_ease_analysis.md | 75 +++++++++++++------ 4 files changed, 68 insertions(+), 32 deletions(-) diff --git a/assets/contributors.csv b/assets/contributors.csv index 4116c50c9e..b469a8a3aa 100644 --- a/assets/contributors.csv +++ b/assets/contributors.csv @@ -85,4 +85,4 @@ Yiyang Fan,Arm,,,, Julien Jayat,Arm,,,, Geremy Cohen,Arm,geremyCohen,geremyinanutshell,, Barbara Corriero,Arm,,,, -Jun He, Arm,,,, +Jun He,Arm,JunHe77,jun-he-91969822,, diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md index c7982c5169..6447610b07 100644 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/2_migrate_ease_spec.md @@ -18,7 +18,7 @@ This tool streamlines the transition, ensuring a smooth and efficient evolution At present, this tool only supports codebase migration to Linux. It can be run on Arm or non-Arm based machines. The tool does not modify any code, it does not provide API level recommendations, and it does not send any data back to OpenAnolis. {{% notice Note %}} -Even though Arm software team do our best to identify known incompatibilities, that's still recommend performing appropriate tests on your application before going to Production. +Even though the [migrate-ease](https://github.com/migrate-ease/) project team does the best to identify known incompatibilities, that's still recommend performing appropriate tests on your application before going to Production. {{% /notice %}} ### List of Supported Programming Languages diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md index 9e1e6301b9..7218571a00 100644 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md @@ -15,20 +15,19 @@ layout: "learningpathall" ## Pre-requisites Before you use migrate-ease, certain pre-requesites need to be installed. {{< tabpane code=true >}} - {{< tab header="Ubuntu/Debian">}} -sudo apt-get install -y python3 python3-pip unzip + {{< tab header="Ubuntu 22.04">}} +sudo apt-get install -y python3 python3-pip python3-venv unzip libmagic1 git {{< /tab >}} - {{< tab header="Fedora">}} -sudo dnf install -y python3 python3-pip unzip + {{< tab header="Debian trixie">}} +sudo apt-get install -y python3 python3-pip python3-venv unzip libmagic1 git + {{< /tab >}} + {{< tab header="Fedora 42">}} +sudo dnf install -y python3 python3-pip unzip git {{< /tab >}} {{< /tabpane >}} ## Install and setup ```bash -# Make sure you're at the root directory of migrate-ease -# Enable Python Environment -python3 -m venv .venv -source .venv/bin/activate # Check out the project git clone https://github.com/migrate-ease/migrate-ease @@ -36,9 +35,13 @@ git clone https://github.com/migrate-ease/migrate-ease # Check the project folder cd migrate-ease +# Make sure you're at the root directory of migrate-ease +# Enable Python Environment +python3 -m venv .venv +source .venv/bin/activate + # install python packages dependencies pip3 install -r requirements.txt - # Setup environment export PYTHONPATH=`pwd` ``` diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md index f6b2aacc71..a8489fdb7e 100644 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/4_migrate_ease_analysis.md @@ -121,34 +121,67 @@ The `issue_summary` provides an overview of the types of issues that the current For each of programming Languages, the available issue types are: {{< tabpane code=true >}} {{< tab header="C++, C">}} - ArchSpecificLibrary - AsmSource - Avx256Intrinsic - Avx512Intrinsic - BuildCommand - CompilerSpecific - ConfigGuess - CrossCompile - DefineOtherArch - HostCpuDetection - InlineAsm - Intrinsic - NoEquivalent - NoEquivalentInlineAsm - NoEquivalentIntrinsic - OldCrt - PragmaSimd - PreprocessorError +Name | Description +------------------------|------------------------------------------------------------------------------------------------------------- +ArchSpecificLibrary | Use of libraries strongly tied to the processor architecture, which may lead to compatibility issues. +AsmSource | Potentially architecture-specific assembly code in the source files that requires manual inspection. +Avx256Intrinsic | Use of AVX256 instructions on the AArch64 architecture lead to compatibility issues. +Avx512Intrinsic | Use of AVX512 instructions on the AArch64 architecture lead to compatibility issues. +BuildCommand | Potential compatibility issues related to the compilation build commands. +CPPLibRecommend | A better-optimized version of this library may be available. +CPPLibVersion | This library version may be incompatible with the AArch64 architecture's compiler. +CPPStdCodes | Compatibility issues or optimization opportunities related to Cpp source and memory order on AArch64. +CompilerSpecific | Code is strongly tied to a compiler version or type, which may lead to compatibility issues. +ConfigGuess | Config.guess file does not contain configurations for AArch64 and may require adaptation. +CrossCompile | Cross-compilation compatibility issues. +DefineOtherArch | Logic in the code that checks for other processor platform types, which may lead to compatibility issues. +HostCpuDetection | Logic for processor platform types in the Makefile, which may lead to platform compatibility issues. +IncompatibleHeaderFile | Incompatible header files. +InlineAsm | Use of inline assembly may lead to AArch64 architecture compatibility issues. +Intrinsic | Use of intrinsics that have compatibility issues with the AArch64 architecture. +NoEquivalentInlineAsm | Use of inline assembly code that does not exist on the AArch64 architecture. +NoEquivalentIntrinsic | Use of intrinsic functions that do not exist on the AArch64 architecture. +OldCrt | Use of an older version of the C runtime library, which may cause compatibility issues or miss optimizations. +Pragma | This #pragma may be incompatible with the AArch64 architecture's compiler. +PreprocessorError | AArch64 architecture may enter the #error preprocessing logic. +SignedChar | Compatibility issues with signed char type data. {{< /tab >}} - {{< tab header="Go">}} + {{< tab header="Java">}} + Name | Description +------------ | -------------------------------------------------------------------------------------------- +JavaJar | Use of JAR package does not support AArch64 architecture. +JavaPom | Pom imports java artifact that does not support AArch64 architecture. +JavaSource | Java source file contains native call that may need modify/rebuild for AArch64 architecture. {{< /tab >}} {{< tab header="Python">}} +Name | Description +------------------|----------------------------------------------------------------------------------------- +PythonInlineAsm | Use of inline assembly in the AArch64 architecture may lead to compatibility issues. +PythonIntrinsic | Use of intrinsic functions that have compatibility issues with the AArch64 architecture. +PythonLinkLibrary | Use of libraries that are incompatible with the AArch64 architecture. +PythonPackage | Use of packages that are incompatible with the AArch64 architecture. {{< /tab >}} - {{< tab header="Rust">}} + {{< tab header="Go">}} +Name | Description +------------------|----------------------------------------------------------------------------------------------------- +Asm | Potentially architecture-specific assembly code in the source files that requires manual inspection. +GolangInlineAsm | Use of inline assembly may lead to AArch64 architecture compatibility issues. +GolangIntrinsic | Use of intrinsic functions that have compatibility issues with the AArch64 architecture. +GolangLinkLibrary | Use of libraries that are incompatible with the AArch64 architecture. {{< /tab >}} - {{< tab header="Java">}} + {{< tab header="Rust">}} +Name | Description +------------------|------------------------------------------------------------------------------------- +RustInlineAsm | Use of inline assembly in the AArch64 architecture may lead to compatibility issues. +RustIntrinsic | Use of intrinsics that have compatibility issues with the AArch64 architecture. +RustLinkLibrary | Use of libraries that are incompatible with the AArch64 architecture. {{< /tab >}} {{< tab header="Dockerfile">}} +Name | Description +-------------------|----------------------------------------------------------------------------------------------------- +ConfigurationInfo | Configuration parameter used in ENV, ARG or LABEL refer an architecture that could not be supported. +Image | A base image is used that might not support AArch64 architecture. +Plugin | A package used in RUN, CMD or ENTRYPOINT does not support AArch64 architecture. {{< /tab >}} {{< /tabpane >}} From 2ec48d19fbcb9a68982defdf8692522bc179a3a4 Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Fri, 9 May 2025 19:05:23 +0100 Subject: [PATCH 7/8] Rename files to remove capital letters from filenames. --- .../migrate-ease/{1_CodeScanning.md => 1_codescanning.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/learning-paths/servers-and-cloud-computing/migrate-ease/{1_CodeScanning.md => 1_codescanning.md} (100%) diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/1_codescanning.md similarity index 100% rename from content/learning-paths/servers-and-cloud-computing/migrate-ease/1_CodeScanning.md rename to content/learning-paths/servers-and-cloud-computing/migrate-ease/1_codescanning.md From e4cb6ba637206ebbb7013a9aa6ff72ff9e69bb7d Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Mon, 12 May 2025 14:46:46 +0100 Subject: [PATCH 8/8] Add WebUI --- .../migrate-ease/3_migrate_ease_run.md | 23 +++++++++++++++++- .../migrate-ease/web_ui_index.jpg | Bin 0 -> 59234 bytes .../migrate-ease/web_ui_result.jpg | Bin 0 -> 294264 bytes 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/web_ui_index.jpg create mode 100644 content/learning-paths/servers-and-cloud-computing/migrate-ease/web_ui_result.jpg diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md index 7218571a00..55fdfe39ff 100644 --- a/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md +++ b/content/learning-paths/servers-and-cloud-computing/migrate-ease/3_migrate_ease_run.md @@ -47,6 +47,8 @@ export PYTHONPATH=`pwd` ``` ## Usage +### As Python script + User can scan a project with a scanner type and the result is sent to console by default. ```bash python3 -m {scanner_name} --arch {arch} {scan_path} @@ -77,4 +79,23 @@ In the case of git repository scan, `{clone_path}` is a directory to hold the cl There are more parameters for user to control the scan behaviors. To get these information user can get the built-in help ```bash python3 -m {scanner_name} -h -``` \ No newline at end of file +``` + +### As Web UI +Migrate-ease also provides a Web UI that supports scanning a git repo with cpp, docker, go, java, python and rust scanners in one time. +To start the web server, simply run: +``` +python3 web/server.py +``` + +Once that is successfully done, you can access a web server hosted at http://localhost:8080 + +The web UI looks as following: +![example image alt-text#center](web_ui_index.jpg "Figure 1. Web UI to scan a git repo") + +A git repo URL is required, and you can specify certain branch name to scan. Once the necessary information is filled, user can click "START SCAN" button to proceed project scanning. + +Scanning progress will be shown in the console pane. Once all jobs are done, user will see a web page as following: +![example image alt-text#center](web_ui_result.jpg "Figure 2. Web UI of scan result") + +You can download the result by clicking the "download" icon or view the result by clicking the "eye" icon. diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/web_ui_index.jpg b/content/learning-paths/servers-and-cloud-computing/migrate-ease/web_ui_index.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba77e2d59716ee7a36db2a4a6a507d6aa06a6ca0 GIT binary patch literal 59234 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

#xTAHjJ|@Z%m(wQP%!dBq3dUY{&F_r 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/migrate-ease/web_ui_result.jpg b/content/learning-paths/servers-and-cloud-computing/migrate-ease/web_ui_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ff252c01e320d83fc9ce4fd69aed805734cda3c GIT binary patch literal 294264 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