programing

memcpy 구현을 제공하는 방법

lastcode 2023. 7. 31. 21:25
반응형

memcpy 구현을 제공하는 방법

저는 베어 메탈 코드를 작성하려고 합니다.memset- 스타일 루프 포함:

for (int i = 0; i < N; ++i) {
  arr[i] = 0;
}

그것은 GCC로 컴파일되고 GCC는 그것을 전화로 바꿀 수 있을 만큼 충분히 똑똑합니다.memset()불행하게도 그것은 베어 메탈이기 때문에 나는 가지고 있지 않습니다.memset()(일반적으로 libc에서) 링크 오류가 발생합니다.

 undefined reference to `memset'

이러한 전환을 수행하는 최적화는 다음과 같습니다.

라이브러리에 대한 호출로 코드를 생성할 수 있는 패턴의 루프 배포를 수행합니다.이 플래그는 -O2 이상에서 기본적으로 활성화됩니다.-fprofile-use그리고.-fauto-profile.

그래서 사람의 해결책은 최적화 수준을 낮추는 것이었습니다.별로 만족스럽지 않습니다.

나는 또한 이것을 설명하는 매우 유용한 페이지를 찾았습니다.-ffreestandingGCC가 이를 수행하지 못하도록 하기에는 충분하지 않으며 기본적으로 사용자가 직접 구현할 수 있는 옵션 외에는 없습니다.memcpy,memmove,memset그리고.memcmp저는 그렇게 해서 기쁩니다, 하지만 어떻게요?

내가 그냥 글을 쓴다면,memset컴파일러는 내부의 루프를 감지하여 memset 호출로 변환합니다!실제로 제가 사용하고 있는 CPU 벤더가 제공한 코드에서 다음과 같은 의견을 발견했습니다.

/*
// This is commented out because the assembly code that the compiler generates appears to be
// wrong.  The code would recursively call the memset function and eventually overruns the
// stack space.
void * memset(void *dest, int ch, size_t count)
...

그래서 저는 그것이 그들이 마주친 문제라고 생각합니다.

의 C 구현을 제공하려면 어떻게 해야 합니까?memset컴파일러가 자신에 대한 호출에 최적화하지 않고 최적화를 비활성화하지 않고 있습니까?

아하 glibc 코드를 확인해보니inhibit_loop_to_libcall이렇게 해야 할 것처럼 들리는 수식어.정의는 다음과 같습니다.

/* Add the compiler optimization to inhibit loop transformation to library
   calls.  This is used to avoid recursive calls in memset and memmove
   default implementations.  */
#ifdef HAVE_CC_INHIBIT_LOOP_TO_LIBCALL
# define inhibit_loop_to_libcall \
    __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
#else
# define inhibit_loop_to_libcall
#endif

질문에서 다음과 같이 언급했습니다.

이 변환을 수행하는 최적화는 다음과 같습니다.

이 최적화를 해제하기 위해 필요한 것은 통과입니다.-fno-tree-loop-distribute-patterns편집자에게.이렇게 하면 전체적으로 최적화가 해제됩니다.

언급URL : https://stackoverflow.com/questions/67210527/how-to-provide-an-implementation-of-memcpy

반응형