From c0a3a192949b5ac42490831651a95c0eec3eea6f Mon Sep 17 00:00:00 2001 From: xgopilot Date: Fri, 31 Oct 2025 04:07:37 +0000 Subject: [PATCH] feat: add export symbol name test to CI for embedded targets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Created _demo/embed/export/ with test for //export directive - Test verifies symbols are exported with correct names (LPSPI2_IRQHandler, SysTick_Handler) - Added CI workflow step to run the test - Essential for embedded development where hardware requires specific symbol names 🤖 Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: luoliwoshang <51194195+luoliwoshang@users.noreply.github.com> --- .github/workflows/llgo.yml | 7 +++ _demo/embed/export/main.go | 22 +++++++ _demo/embed/export/test.sh | 118 +++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 _demo/embed/export/main.go create mode 100755 _demo/embed/export/test.sh diff --git a/.github/workflows/llgo.yml b/.github/workflows/llgo.yml index 4441d04a..11f25cc9 100644 --- a/.github/workflows/llgo.yml +++ b/.github/workflows/llgo.yml @@ -133,6 +133,13 @@ jobs: chmod +x test.sh ./test.sh + - name: Test export symbol names for embedded targets + run: | + echo "Testing //export with different symbol names for embedded development..." + cd _demo/embed/export + chmod +x test.sh + ./test.sh + - name: _xtool build tests run: | cd _xtool diff --git a/_demo/embed/export/main.go b/_demo/embed/export/main.go new file mode 100644 index 00000000..ec29c390 --- /dev/null +++ b/_demo/embed/export/main.go @@ -0,0 +1,22 @@ +package main + +//export LPSPI2_IRQHandler +func interruptLPSPI2() { + println("LPSPI2 interrupt handled") +} + +//export SysTick_Handler +func systemTickHandler() { + println("System tick") +} + +//export Add +func Add(a, b int) int { + return a + b +} + +func main() { + interruptLPSPI2() + systemTickHandler() + println("Add(2, 3) =", Add(2, 3)) +} diff --git a/_demo/embed/export/test.sh b/_demo/embed/export/test.sh new file mode 100755 index 00000000..0a132931 --- /dev/null +++ b/_demo/embed/export/test.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +# Test script for //export with different symbol names +# This is essential for embedded development where hardware specifications require +# specific symbol names (e.g., ARM Cortex-M interrupt handlers). + +set -e # Exit on any error + +# Get script directory +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Function to print colored output +print_status() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Check if llgo command is available +if ! command -v llgo &> /dev/null; then + print_error "llgo command not found, please install llgo first" + exit 1 +fi + +# Check if LLGO_ROOT is set +if [[ -z "$LLGO_ROOT" ]]; then + print_error "LLGO_ROOT environment variable is not set" + exit 1 +fi + +print_status "Starting export symbol name test..." +print_status "Working directory: $SCRIPT_DIR" +print_status "LLGO_ROOT: $LLGO_ROOT" + +echo "" + +# Build the test program +print_status "=== Building test program ===" +if llgo build -o test_export main.go; then + print_status "Build succeeded" +else + print_error "Build failed" + exit 1 +fi + +# Check for expected symbols using nm +print_status "=== Checking exported symbols with nm ===" +if ! command -v nm &> /dev/null; then + print_error "nm command not found, skipping symbol verification" + exit 1 +fi + +NM_OUTPUT=$(nm test_export) + +# Verify LPSPI2_IRQHandler symbol exists (not interruptLPSPI2) +if echo "$NM_OUTPUT" | grep -q "LPSPI2_IRQHandler"; then + print_status "✓ Symbol LPSPI2_IRQHandler found" +else + print_error "✗ Symbol LPSPI2_IRQHandler not found" + echo "Available symbols:" + echo "$NM_OUTPUT" + exit 1 +fi + +# Verify SysTick_Handler symbol exists (not systemTickHandler) +if echo "$NM_OUTPUT" | grep -q "SysTick_Handler"; then + print_status "✓ Symbol SysTick_Handler found" +else + print_error "✗ Symbol SysTick_Handler not found" + echo "Available symbols:" + echo "$NM_OUTPUT" + exit 1 +fi + +# Verify Add symbol exists (same name) +if echo "$NM_OUTPUT" | grep -q "Add"; then + print_status "✓ Symbol Add found" +else + print_error "✗ Symbol Add not found" + echo "Available symbols:" + echo "$NM_OUTPUT" + exit 1 +fi + +# Verify that the original function names are NOT exported as main symbols +# (they should only appear as internal symbols, not as exported text symbols 'T') +EXPORTED_SYMBOLS=$(echo "$NM_OUTPUT" | grep " T " || true) + +if echo "$EXPORTED_SYMBOLS" | grep -q "interruptLPSPI2"; then + print_error "✗ Unexpected exported symbol: interruptLPSPI2 (should be LPSPI2_IRQHandler)" + exit 1 +else + print_status "✓ interruptLPSPI2 not exported as main symbol" +fi + +if echo "$EXPORTED_SYMBOLS" | grep -q "systemTickHandler"; then + print_error "✗ Unexpected exported symbol: systemTickHandler (should be SysTick_Handler)" + exit 1 +else + print_status "✓ systemTickHandler not exported as main symbol" +fi + +echo "" +print_status "=== All symbol name tests passed! ===" + +# Cleanup +rm -f test_export + +print_status "Export symbol name test completed successfully!"