diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -1106,6 +1106,11 @@ M->setTargetTriple(CI.getTargetOpts().Triple); return M; } + + // For ThinLTO explicitely set opaque pointer mode to avoid problems when + // mixing opaque pointers and typed pointers bitcode files. + VMContext->setOpaquePointers(CI.getCodeGenOpts().OpaquePointers); + Expected> MOrErr = Bm->parseModule(*VMContext); if (!MOrErr) diff --git a/clang/test/CodeGen/Inputs/thinlto-opaque.ll b/clang/test/CodeGen/Inputs/thinlto-opaque.ll new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/Inputs/thinlto-opaque.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64--" + +define ptr @f2() { + ret ptr null +} diff --git a/clang/test/CodeGen/thinlto-opaque-typed-mix.ll b/clang/test/CodeGen/thinlto-opaque-typed-mix.ll new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/thinlto-opaque-typed-mix.ll @@ -0,0 +1,24 @@ +; REQUIRES: x86-registered-target +; Test that mixing bitcode file with opaque and typed pointers works. + +; RUN: mkdir -p %t +; RUN: opt -module-summary -o %t/typed.bc %s +; RUN: opt -module-summary -o %t/opaque.bc %S/Inputs/thinlto-opaque.ll +; RUN: llvm-lto2 run -thinlto-distributed-indexes %t/typed.bc %t/opaque.bc \ +; RUN: -o %t/native.o -r %t/typed.bc,main,plx -r %t/typed.bc,f2, \ +; RUN: -r %t/opaque.bc,f2,p + +; RUN: %clang_cc1 -triple x86_64-- -emit-obj -o %t/native.o %t/typed.bc \ +; RUN: -Wno-override-module \ +; RUN: -fthinlto-index=%t/typed.bc.thinlto.bc +; RUN: false + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64--" + +declare i8* @f2() + +define i32 @main() { + call i8* @f2() + ret i32 0 +}