diff --git a/arch/arm/arm/src/los_exc.c b/arch/arm/arm/src/los_exc.c index c90f591ff56c85c2943ac320425094b2d70819e3..297a061bd1713b70bc4d26347de4004f0701c621 100644 --- a/arch/arm/arm/src/los_exc.c +++ b/arch/arm/arm/src/los_exc.c @@ -721,7 +721,7 @@ VOID BackTraceSub(UINTPTR regFP) while (IsValidFP(backFP, stackStart, stackEnd, &kvaddr) == TRUE) { tmpFP = backFP; #ifdef LOSCFG_COMPILER_CLANG_LLVM - backFP = *(UINTPTR *)(UINTPTR)kvaddr; + backFP = *(UINTPTR *)(UINTPTR)kvaddr; if (IsValidFP(tmpFP + POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) { PrintExcInfo("traceback backLR check failed, backLP: 0x%x\n", tmpFP + POINTER_SIZE); return; @@ -1215,7 +1215,11 @@ VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 recordCount, UINT32 jumpCou framePtr = Get_Fp(); while ((framePtr > stackStart) && (framePtr < stackEnd) && IS_ALIGNED(framePtr, sizeof(CHAR *))) { tmpFramePtr = framePtr; +#ifdef LOSCFG_COMPILER_CLANG_LLVM + linkReg = *(UINTPTR *)(tmpFramePtr + sizeof(UINTPTR)); +#else linkReg = *(UINTPTR *)framePtr; +#endif if (index >= jumpCount) { LR[count++] = linkReg; if (count == recordCount) { @@ -1223,7 +1227,11 @@ VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 recordCount, UINT32 jumpCou } } index++; +#ifdef LOSCFG_COMPILER_CLANG_LLVM + framePtr = *(UINTPTR *)framePtr; +#else framePtr = *(UINTPTR *)(tmpFramePtr - sizeof(UINTPTR)); +#endif } /* if linkReg is not enough,clean up the last of the effective LR as the end. */