2016-08-26 8 views
0

C++ API를 통해 llvm에 중첩 함수를 구현하려고합니다. (컴파일 될 프로그램이 올바른 중첩 참조 등을 갖도록 보장하기 위해) 의미 론적 검사를 수행 한 후에 llvm에서 동일한 범위의 모든 함수를 정의하고 모든 변수를 전역 변수로 설정합니다. 나는이 일을 예상하고 있었다 그러나 나는 명령으로 .o 인 파일에서 실행 파일을 가져 오는 동안 자신이 큰 문제가 발견 : 내가 얻을 글로벌 변수 중 하나 llvm::GlobalValue::WeakAnyLinkage 또는 llvm::GlobalValue::ExternalLinkage 연결을 사용하여전역 변수가있는 llvm 바이트 코드에서 오브젝트 파일을 컴파일 할 때 Clang-3.8 정의되지 않은 'main'참조

"llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a -v -o out" 

:

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12

...

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':

(.text+0x20): undefined reference to `main'

주요의 정의, 내 IR 코드의 정의와 함께 할 것 같다

는 약자

; Function Attrs: nounwind uwtable define void @main() #0 {

문제는 전역 변수를 사용하지 않았을 때 같은 명령이 문제가되지 않는다는 것입니다. 물론 전역 변수를 alloca로 변경하려고했던 이유로 하위 함수에서 변수가 사용 된 경우는 예외입니다.

이 문제에 대한 해결책을 찾으십시오. 미리 감사드립니다. 주 : 내가 사용하는 LLVM-3.8

업데이트 : 결과가 있던 그 소리 명령에서 -v 제거 :이 모든 변수를 LLVM IR에서 내 프로그램의 시작 부분에 정의 된

refined_output.o: In function bsort': refined_output.ll:(.text+0x4): undefined reference to x' refined_output.ll:(.text+0xa): undefined reference to n' refined_output.ll:(.text+0x10): undefined reference to changed' refined_output.ll:(.text+0x22): undefined reference to i' refined_output.ll:(.text+0x2c): undefined reference to changed' refined_output.ll:(.text+0x42): undefined reference to i' refined_output.ll:(.text+0x48): undefined reference to n' refined_output.ll:(.text+0x50): undefined reference to i' refined_output.ll:(.text+0x59): undefined reference to x' refined_output.ll:(.text+0x60): undefined reference to i' refined_output.ll:(.text+0x75): undefined reference to x' refined_output.ll:(.text+0x7c): undefined reference to i' refined_output.ll:(.text+0x95): undefined reference to changed' refined_output.ll:(.text+0xa3): undefined reference to changed' refined_output.o: In function swap': refined_output.ll:(.text+0xc3): undefined reference to x.1' refined_output.ll:(.text+0xca): undefined reference to y' refined_output.ll:(.text+0xd1): undefined reference to x.1' refined_output.ll:(.text+0xd9): undefined reference to t' refined_output.ll:(.text+0xe0): undefined reference to x.1' refined_output.ll:(.text+0xe7): undefined reference to y' refined_output.ll:(.text+0xf2): undefined reference to y' refined_output.ll:(.text+0xf8): undefined reference to t' refined_output.o: In function main': refined_output.ll:(.text+0x102): undefined reference to i.4' refined_output.ll:(.text+0x10c): undefined reference to seed' refined_output.ll:(.text+0x123): undefined reference to x.2' refined_output.ll:(.text+0x12a): undefined reference to i.4' refined_output.ll:(.text+0x130): undefined reference to seed' refined_output.ll:(.text+0x15d): undefined reference to seed' refined_output.ll:(.text+0x166): undefined reference to i.4' refined_output.ll:(.text+0x16c): undefined reference to i.4' refined_output.ll:(.text+0x177): undefined reference to x.2' refined_output.ll:(.text+0x18d): undefined reference to x.2' refined_output.ll:(.text+0x19e): undefined reference to x.2' refined_output.o: In function printArray': refined_output.ll:(.text+0x1c4): undefined reference to msg' refined_output.ll:(.text+0x1cb): undefined reference to x.2' refined_output.ll:(.text+0x1d1): undefined reference to n.3' refined_output.ll:(.text+0x1d8): undefined reference to msg' refined_output.ll:(.text+0x1e3): undefined reference to i.4' refined_output.ll:(.text+0x1f3): undefined reference to x.2' refined_output.ll:(.text+0x1fa): undefined reference to i.4' refined_output.ll:(.text+0x208): undefined reference to i.4' refined_output.ll:(.text+0x20e): undefined reference to i.4' refined_output.ll:(.text+0x214): undefined reference to n.3' refined_output.ll:(.text+0x21c): undefined reference to i.4'

clang: error: linker command failed with exit code 1 (use -v to see invocation)

다음과 같이 입력하십시오 :

@x = external global i32* 
@n = external global i32 
@i = external global i32 
@changed = external global i1 
@x.1 = external global i32* 
@y = external global i32* 
@t = external global i32 
@msg = external global i8* 
@x.2 = external global i32* 
@n.3 = external global i32 
@i.4 = external global i32 
@const_string_temp = private constant [3 x i8] c", \00", align 1 
@const_string_temp.5 = private constant [2 x i8] c"\0A\00", align 1 
@i.6 = external global i32 
@x.7 = external global i32 
@seed = external global i32 
@const_string_temp.8 = private constant [16 x i8] c"Initial array: \00", align 1 
@const_string_temp.9 = private constant [15 x i8] c"Sorted array: \00", align 1 

이 정보가 도움이 되었으면 좋겠습니다. 아니면 IRC 생성시 문제를 찾을 수 있기를 바랍니다.

나는 그것을 기대하고 ..

+0

void main? 확실합니까? – kfsone

+0

int main()로 변경해도 아무 것도 변경되지 않습니다. –

답변

2
@x = external global i32* 

등 글로벌 변수를 선언하지 정의입니다. 따라서 "정의되지 않은 참조"오류가 유효하며 실제로 정의해야합니다.

는 또한 그 LLVM-AS/LLC 부분이 중복되어 있습니다 자세한 내용은 http://llvm.org/docs/LangRef.html#global-variables를 참조하십시오 - 그 소리가 잘/.bc 파일을 .ll 컴파일 할 수 있습니다.

+0

변수 또는 적어도 하나를 사용하는 모든 함수 (첫 번째 변수와 같은)에서해야합니까? 둘째로 C++ API 호출을 정의하여 성공적으로 정의 할 수 있습니까? 미리 감사드립니다! –

+0

문제가 해결되었습니다. 해결 방법은 C++ API 호출 인 gvar-> setInitializer()를 사용하여 각 전역 변수에 초기화 코드를 설정하는 것입니다. 그것을 제대로하는 방법을 찾으려면 다음과 같이 clang을 사용할 수 있습니다 : clang-3.8 -c -emit-llvm input.cpp -o input.ll 그리고 그 다음에 llc-3.8 -march = cpp -o output.ll.cpp 입력. ll. 매번 C++에서와 같이 원하는 전역 변수를 작성하고 각 변수 유형에 연결된 C++ API 호출을 확인하십시오. –