Skip to content

Commit

Permalink
Explicitly initialize opaque pointer mode in CodeGenAction
Browse files Browse the repository at this point in the history
Explicitly call `LLVMContext::setOpaquePointers` in `CodeGenAction`
before loading any IR files. With this we use the mode specified on the
command-line rather than lazily initializing it based on the contents of
the IR.

This helps when using `-fthinlto-index` which may end up mixing files
with typed and opaque pointer types which fails when the first file
happened to use typed pointers since we cannot downgrade IR with opaque
pointer types to typed pointer types.

Differential Revision: https://reviews.llvm.org/D137475
  • Loading branch information
MatzeB committed Nov 7, 2022
1 parent 463da45 commit cafe50d
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 1 deletion.
2 changes: 2 additions & 0 deletions clang/lib/CodeGen/CodeGenAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1102,6 +1102,8 @@ CodeGenAction::loadModule(MemoryBufferRef MBRef) {
CompilerInstance &CI = getCompilerInstance();
SourceManager &SM = CI.getSourceManager();

VMContext->setOpaquePointers(CI.getCodeGenOpts().OpaquePointers);

// For ThinLTO backend invocations, ensure that the context
// merges types based on ODR identifiers. We also need to read
// the correct module out of a multi-module bitcode file.
Expand Down
6 changes: 6 additions & 0 deletions clang/test/CodeGen/Inputs/thinlto-opaque.ll
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 1 addition & 1 deletion clang/test/CodeGen/thinlto-distributed-cfi-devirt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ cont2:
; CHECK-IR: br i1 {{.*}}, label %trap

; We still have to call it as virtual.
; CHECK-IR: %call3 = tail call i32 %7
; CHECK-IR: %call3 = tail call i32 {{%[0-9]+}}
%call3 = tail call i32 %8(%struct.A* nonnull %obj, i32 %call)
ret i32 %call3
}
Expand Down
23 changes: 23 additions & 0 deletions clang/test/CodeGen/thinlto-opaque-typed-mix.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
; 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

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
}

0 comments on commit cafe50d

Please sign in to comment.