MatzeB updated this revision to Diff 430838. Herald added subscribers: cfe-commits, arichardson. Herald added a reviewer: MaskRay. Herald added a project: clang.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125847/new/ https://reviews.llvm.org/D125847 Files: clang/lib/Driver/ToolChains/CommonArgs.cpp clang/test/CodeGen/thinlto-inline-asm2.c clang/test/Driver/arm-float-abi-lto.c clang/test/Driver/lto-no-opaque-pointers.c clang/test/Driver/lto-opaque-pointers.c clang/test/Driver/memtag_lto.c lld/ELF/Config.h lld/ELF/Driver.cpp lld/ELF/LTO.cpp lld/ELF/Options.td lld/test/ELF/lto/wrap-unreferenced-before-codegen.test llvm/docs/OpaquePointers.rst llvm/include/llvm/LTO/Config.h llvm/test/LTO/X86/Inputs/opaque-pointers.ll llvm/test/LTO/X86/mix-opaque-typed.ll llvm/tools/gold/gold-plugin.cpp llvm/tools/llvm-lto2/llvm-lto2.cpp
Index: llvm/tools/llvm-lto2/llvm-lto2.cpp =================================================================== --- llvm/tools/llvm-lto2/llvm-lto2.cpp +++ llvm/tools/llvm-lto2/llvm-lto2.cpp @@ -143,6 +143,10 @@ cl::desc("Run PGO context sensitive IR instrumentation"), cl::init(false), cl::Hidden); +static cl::opt<bool> LtoOpaquePointers("lto-opaque-pointers", + cl::desc("Enable opaque pointer types"), + cl::Hidden); + static cl::opt<bool> DebugPassManager("debug-pass-manager", cl::init(false), cl::Hidden, cl::desc("Print pass management debugging information")); @@ -291,6 +295,7 @@ Conf.StatsFile = StatsFile; Conf.PTO.LoopVectorization = Conf.OptLevel > 1; Conf.PTO.SLPVectorization = Conf.OptLevel > 1; + Conf.OpaquePointers = LtoOpaquePointers; ThinBackend Backend; if (ThinLTODistributedIndexes) Index: llvm/tools/gold/gold-plugin.cpp =================================================================== --- llvm/tools/gold/gold-plugin.cpp +++ llvm/tools/gold/gold-plugin.cpp @@ -208,6 +208,8 @@ static std::string stats_file; // Asserts that LTO link has whole program visibility static bool whole_program_visibility = false; + // Use opaque pointer types. + static bool opaque_pointers = false; // Optimization remarks filename, accepted passes and hotness options static std::string RemarksFilename; @@ -308,6 +310,10 @@ RemarksFormat = std::string(opt); } else if (opt.consume_front("stats-file=")) { stats_file = std::string(opt); + } else if (opt == "opaque-pointers") { + opaque_pointers = true; + } else if (opt == "no-opaque-pointers") { + opaque_pointers = false; } else { // Save this option to pass to the code generator. // ParseCommandLineOptions() expects argv[0] to be program name. Lazily @@ -957,6 +963,8 @@ Conf.HasWholeProgramVisibility = options::whole_program_visibility; + Config.OpaquePointers = options.opaque_pointers; + Conf.StatsFile = options::stats_file; return std::make_unique<LTO>(std::move(Conf), Backend, options::ParallelCodeGenParallelismLevel); Index: llvm/test/LTO/X86/mix-opaque-typed.ll =================================================================== --- /dev/null +++ llvm/test/LTO/X86/mix-opaque-typed.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as -opaque-pointers=0 %s -o %t-typed.bc +; RUN: llvm-as -opaque-pointers=1 %S/Inputs/opaque-pointers.ll -o %t-opaque.bc +; RUN: llvm-lto2 run -o %t-lto.bc %t-typed.bc %t-opaque.bc -save-temps \ +; RUN: -lto-opaque-pointers \ +; RUN: -r %t-typed.bc,call_foo,px -r %t-typed.bc,foo,l \ +; RUN: -r %t-opaque.bc,foo,px +; RUN: opt -S -o - %t-lto.bc.0.4.opt.bc | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +declare i64 @foo(i64* %p); + +define i64 @call_foo(i64* %p) { + ; CHECK-LABEL: define i64 @call_foo(ptr nocapture readonly %p) local_unnamed_addr #0 { + ; CHECK-NEXT: %t.i = load i64, ptr %p, align 8 + %t = call i64 @foo(i64* %p) + ret i64 %t +} Index: llvm/test/LTO/X86/Inputs/opaque-pointers.ll =================================================================== --- /dev/null +++ llvm/test/LTO/X86/Inputs/opaque-pointers.ll @@ -0,0 +1,7 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define i64 @foo(ptr %p) { + %t = load i64, ptr %p + ret i64 %t +} Index: llvm/include/llvm/LTO/Config.h =================================================================== --- llvm/include/llvm/LTO/Config.h +++ llvm/include/llvm/LTO/Config.h @@ -177,6 +177,10 @@ /// Add FSAFDO discriminators. bool AddFSDiscriminator = false; + /// Use opaque pointer types. Used to call LLVMContext::setOpaquePointers + /// unless already set by the `-opaque-pointers` commandline option. + bool OpaquePointers = false; + /// If this field is set, LTO will write input file paths and symbol /// resolutions here in llvm-lto2 command line flag format. This can be /// used for testing and for running the LTO pipeline outside of the linker @@ -288,6 +292,8 @@ enableDebugTypeODRUniquing(); setDiagnosticHandler( std::make_unique<LTOLLVMDiagnosticHandler>(&DiagHandler), true); + if (!hasSetOpaquePointersValue()) + setOpaquePointers(C.OpaquePointers); } DiagnosticHandlerFunction DiagHandler; }; Index: llvm/docs/OpaquePointers.rst =================================================================== --- llvm/docs/OpaquePointers.rst +++ llvm/docs/OpaquePointers.rst @@ -65,9 +65,9 @@ mode (currently still the default) all pointer types have a pointee type and opaque pointers cannot be used. In opaque pointers mode, all pointers are opaque. The opaque pointer mode can be enabled using ``-opaque-pointers`` in -LLVM tools like ``opt``, or ``-Xclang -opaque-pointers`` in clang. Additionally, -opaque pointer mode is automatically enabled for IR and bitcode files that use -the ``ptr`` type. +LLVM tools like ``opt``, or ``-Xclang -opaque-pointers`` in clang, +``-Wl,-plugin-opt=-opaque-pointers`` for LTO. Additionally, opaque pointer mode +is automatically enabled for IR and bitcode files that use the ``ptr`` type. In opaque pointer mode, all typed pointers used in IR, bitcode, or created using ``PointerType::get()`` and similar APIs are automatically converted into Index: lld/test/ELF/lto/wrap-unreferenced-before-codegen.test =================================================================== --- lld/test/ELF/lto/wrap-unreferenced-before-codegen.test +++ lld/test/ELF/lto/wrap-unreferenced-before-codegen.test @@ -28,8 +28,9 @@ # RUN: llvm-mc -triple x86_64-elf -filetype=obj -o %t/malloc.o %t/malloc.s # RUN: ld.lld -shared -o %t/libmalloc.so -soname libmalloc.so %t/malloc.o # RUN: llvm-mc -triple x86_64-elf -filetype=obj -o %t/emutls.o %t/emutls.s -# RUN: llvm-as -o %t/usetls.bc %t/usetls.ll -# RUN: ld.lld -shared -o %t/libusetls.so %t/usetls.bc %t/libmalloc.so \ +# RUN: llvm-as -opaque-pointers=1 -o %t/usetls.bc %t/usetls.ll +# RUN: ld.lld --opaque-pointers -shared -o %t/libusetls.so \ +# RUN: %t/usetls.bc RUN: %t/libmalloc.so \ # RUN: --start-lib %t/emutls.o -mllvm -emulated-tls --wrap malloc # RUN: llvm-objdump --dynamic-reloc --disassemble %t/libusetls.so | \ # RUN: FileCheck --check-prefix=USETLS-DISASM %s Index: lld/ELF/Options.td =================================================================== --- lld/ELF/Options.td +++ lld/ELF/Options.td @@ -306,6 +306,10 @@ def omagic: FF<"omagic">, MetaVarName<"<magic>">, HelpText<"Set the text and data sections to be readable and writable, do not page align sections, link against static libraries">; +defm opaque_pointers: BB<"opaque-pointers", + "Use opaque pointers in IR used during LTO", + "Use typed pointers in IR used during LTO (default)">; + defm orphan_handling: Eq<"orphan-handling", "Control how orphan sections are handled when linker script used">; @@ -626,6 +630,12 @@ def: J<"plugin-opt=obj-path=">, Alias<lto_obj_path_eq>, HelpText<"Alias for --lto-obj-path=">; +def: J<"plugin-opt=-opaque-pointers">, + Alias<opaque_pointers>, + HelpText<"Alias for --opaque-pointers">; +def: J<"plugin-opt=-no-opaque-pointers">, + Alias<no_opaque_pointers>, + HelpText<"Alias for --no-opaque-pointers">; def: J<"plugin-opt=opt-remarks-filename=">, Alias<opt_remarks_filename>, HelpText<"Alias for --opt-remarks-filename">; Index: lld/ELF/LTO.cpp =================================================================== --- lld/ELF/LTO.cpp +++ lld/ELF/LTO.cpp @@ -164,6 +164,8 @@ c.RunCSIRInstr = config->ltoCSProfileGenerate; c.PGOWarnMismatch = config->ltoPGOWarnMismatch; + c.OpaquePointers = config->opaquePointers; + if (config->emitLLVM) { c.PostInternalizeModuleHook = [](size_t task, const Module &m) { if (std::unique_ptr<raw_fd_ostream> os = Index: lld/ELF/Driver.cpp =================================================================== --- lld/ELF/Driver.cpp +++ lld/ELF/Driver.cpp @@ -1126,6 +1126,8 @@ config->nostdlib = args.hasArg(OPT_nostdlib); config->oFormatBinary = isOutputFormatBinary(args); config->omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false); + config->opaquePointers = + args.hasFlag(OPT_opaque_pointers, OPT_no_opaque_pointers, false); config->optRemarksFilename = args.getLastArgValue(OPT_opt_remarks_filename); config->optStatsFilename = args.getLastArgValue(OPT_plugin_opt_stats_file); Index: lld/ELF/Config.h =================================================================== --- lld/ELF/Config.h +++ lld/ELF/Config.h @@ -198,6 +198,7 @@ bool nostdlib; bool oFormatBinary; bool omagic; + bool opaquePointers; bool optEB = false; bool optEL = false; bool optimizeBBJumps; Index: clang/test/Driver/memtag_lto.c =================================================================== --- clang/test/Driver/memtag_lto.c +++ clang/test/Driver/memtag_lto.c @@ -8,9 +8,9 @@ // RUN: %clang -O1 -target aarch64-unknown-linux -mllvm -stack-safety-print %s -S -o - 2>&1 | FileCheck %s // Full LTO -// RUN: %clang -O1 -target aarch64-unknown-linux -c %s -flto=full -o %t.ltonewpm1.bc -// RUN: %clang -O1 -target aarch64-unknown-linux -c -DBUILD2 %s -flto=full -o %t.ltonewpm2.bc -// RUN: llvm-lto2 run -o %t.ltonewpm %t.ltonewpm1.bc %t.ltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ +// RUN: %clang -O1 -target aarch64-unknown-linux -c %s -Xclang -opaque-pointers -flto=full -o %t.ltonewpm1.bc +// RUN: %clang -O1 -target aarch64-unknown-linux -c -DBUILD2 %s -Xclang -opaque-pointers -flto=full -o %t.ltonewpm2.bc +// RUN: llvm-lto2 run -lto-opaque-pointers -o %t.ltonewpm %t.ltonewpm1.bc %t.ltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ // RUN: -r %t.ltonewpm1.bc,fn,plx \ // RUN: -r %t.ltonewpm1.bc,use,lx \ // RUN: -r %t.ltonewpm1.bc,use_local,plx \ @@ -19,9 +19,9 @@ // RUN: -r %t.ltonewpm2.bc,z, 2>&1 | FileCheck %s --allow-empty // Thin LTO, new PM -// RUN: %clang -O1 -target aarch64-unknown-linux -c %s -flto=thin -o %t.thinltonewpm1.bc -// RUN: %clang -O1 -target aarch64-unknown-linux -c -DBUILD2 %s -flto=thin -o %t.thinltonewpm2.bc -// RUN: llvm-lto2 run -o %t.thinltonewpm %t.thinltonewpm1.bc %t.thinltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ +// RUN: %clang -O1 -target aarch64-unknown-linux -c %s -Xclang -opaque-pointers -flto=thin -o %t.thinltonewpm1.bc +// RUN: %clang -O1 -target aarch64-unknown-linux -c -DBUILD2 %s -Xclang -opaque-pointers -flto=thin -o %t.thinltonewpm2.bc +// RUN: llvm-lto2 run -lto-opaque-pointers -o %t.thinltonewpm %t.thinltonewpm1.bc %t.thinltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ // RUN: -r %t.thinltonewpm1.bc,fn,plx \ // RUN: -r %t.thinltonewpm1.bc,use,lx \ // RUN: -r %t.thinltonewpm1.bc,use_local,plx \ @@ -39,9 +39,9 @@ // RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -mllvm -stack-safety-print %s -S -o /dev/null 2>&1 | FileCheck %s -check-prefixes=SSI,XUNSAFE,YSAFE // Full LTO: both are safe. -// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c %s -flto=full -o %t.ltonewpm1.bc -// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c -DBUILD2 %s -flto=full -o %t.ltonewpm2.bc -// RUN: llvm-lto2 run -o %t.ltonewpm %t.ltonewpm1.bc %t.ltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ +// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c %s -Xclang -opaque-pointers -flto=full -o %t.ltonewpm1.bc +// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c -DBUILD2 %s -Xclang -opaque-pointers -flto=full -o %t.ltonewpm2.bc +// RUN: llvm-lto2 run -lto-opaque-pointers -o %t.ltonewpm %t.ltonewpm1.bc %t.ltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ // RUN: -r %t.ltonewpm1.bc,fn,plx \ // RUN: -r %t.ltonewpm1.bc,use,lx \ // RUN: -r %t.ltonewpm1.bc,use_local,plx \ @@ -50,9 +50,9 @@ // RUN: -r %t.ltonewpm2.bc,z, 2>&1 | FileCheck %s -check-prefixes=SSI,XSAFE,YSAFE // Thin LTO: both are safe. -// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c %s -flto=thin -o %t.thinltonewpm1.bc -// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c -DBUILD2 %s -flto=thin -o %t.thinltonewpm2.bc -// RUN: llvm-lto2 run -o %t.thinltonewpm %t.thinltonewpm1.bc %t.thinltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ +// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c %s -Xclang -opaque-pointers -flto=thin -o %t.thinltonewpm1.bc +// RUN: %clang -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c -DBUILD2 %s -Xclang -opaque-pointers -flto=thin -o %t.thinltonewpm2.bc +// RUN: llvm-lto2 run -lto-opaque-pointers -o %t.thinltonewpm %t.thinltonewpm1.bc %t.thinltonewpm2.bc -save-temps -stack-safety-print -thinlto-threads 1 -O1 \ // RUN: -r %t.thinltonewpm1.bc,fn,plx \ // RUN: -r %t.thinltonewpm1.bc,use,lx \ // RUN: -r %t.thinltonewpm1.bc,use_local,plx \ Index: clang/test/Driver/lto-opaque-pointers.c =================================================================== --- /dev/null +++ clang/test/Driver/lto-opaque-pointers.c @@ -0,0 +1,6 @@ +// REQUIRES: enable-opaque-pointers +// RUN: %clang -target x86_64-unknown-linux -### %s -flto 2> %t +// RUN: FileCheck %s < %t + +// CHECK: -plugin-opt=-opaque-pointers +// CHECK-NOT: -plugin-opt=-no-opaque-pointers Index: clang/test/Driver/lto-no-opaque-pointers.c =================================================================== --- /dev/null +++ clang/test/Driver/lto-no-opaque-pointers.c @@ -0,0 +1,5 @@ +// UNSUPPORTED: enable-opaque-pointers +// RUN: %clang -target x86_64-unknown-linux -### %s -flto 2> %t +// RUN: FileCheck %s < %t + +// CHECK-NOT: -plugin-opt=-opaque-pointers Index: clang/test/Driver/arm-float-abi-lto.c =================================================================== --- clang/test/Driver/arm-float-abi-lto.c +++ clang/test/Driver/arm-float-abi-lto.c @@ -2,9 +2,9 @@ // RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -S -o - -emit-llvm -DCALL_LIB -DDEFINE_LIB | FileCheck %s -// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -flto=full -c -o %t.call_full.bc -DCALL_LIB -// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -flto=full -c -o %t.define_full.bc -DDEFINE_LIB -// RUN: llvm-lto2 run -o %t.lto_full -save-temps %t.call_full.bc %t.define_full.bc \ +// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -Xclang -opaque-pointers -flto=full -c -o %t.call_full.bc -DCALL_LIB +// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -Xclang -opaque-pointers -flto=full -c -o %t.define_full.bc -DDEFINE_LIB +// RUN: llvm-lto2 run -lto-opaque-pointers -o %t.lto_full -save-temps %t.call_full.bc %t.define_full.bc \ // RUN: -r %t.call_full.bc,fn,px \ // RUN: -r %t.call_full.bc,fwrite,l \ // RUN: -r %t.call_full.bc,putchar,l \ @@ -14,9 +14,9 @@ // RUN: -r %t.define_full.bc,otherfn,px // RUN: llvm-dis %t.lto_full.0.4.opt.bc -o - | FileCheck %s -// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -flto=thin -c -o %t.call_thin.bc -DCALL_LIB -// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -flto=thin -c -o %t.define_thin.bc -DDEFINE_LIB -// RUN: llvm-lto2 run -o %t.lto_thin -save-temps %t.call_thin.bc %t.define_thin.bc \ +// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -Xclang -opaque-pointers -flto=thin -c -o %t.call_thin.bc -DCALL_LIB +// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m33 -mfloat-abi=hard -O1 %s -Xclang -opaque-pointers -flto=thin -c -o %t.define_thin.bc -DDEFINE_LIB +// RUN: llvm-lto2 run -lto-opaque-pointers -o %t.lto_thin -save-temps %t.call_thin.bc %t.define_thin.bc \ // RUN: -r %t.call_thin.bc,fn,px \ // RUN: -r %t.call_thin.bc,fwrite,l \ // RUN: -r %t.call_thin.bc,putchar,l \ Index: clang/test/CodeGen/thinlto-inline-asm2.c =================================================================== --- clang/test/CodeGen/thinlto-inline-asm2.c +++ clang/test/CodeGen/thinlto-inline-asm2.c @@ -1,11 +1,11 @@ // REQUIRES: x86-registered-target // RUN: split-file %s %t -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -flto=thin -emit-llvm-bc %t/a.c -o %t/a.bc -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -flto=thin -emit-llvm-bc %t/b.c -o %t/b.bc +// RUN: %clang_cc1 -opaque-pointers -triple x86_64-unknown-linux-gnu -flto=thin -emit-llvm-bc %t/a.c -o %t/a.bc +// RUN: %clang_cc1 -opaque-pointers -triple x86_64-unknown-linux-gnu -flto=thin -emit-llvm-bc %t/b.c -o %t/b.bc // RUN: llvm-nm %t/a.bc | FileCheck %s --check-prefix=NM -// RUN: llvm-lto2 run %t/a.bc %t/b.bc -o %t/out -save-temps -r=%t/a.bc,ref,plx -r=%t/b.bc,ff_h264_cabac_tables,pl +// RUN: llvm-lto2 run -lto-opaque-pointers %t/a.bc %t/b.bc -o %t/out -save-temps -r=%t/a.bc,ref,plx -r=%t/b.bc,ff_h264_cabac_tables,pl // RUN: llvm-dis < %t/out.2.2.internalize.bc | FileCheck %s //--- a.c Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -559,6 +559,9 @@ CmdArgs.push_back( Args.MakeArgString("-plugin-opt=jobs=" + Twine(Parallelism))); + if (CLANG_ENABLE_OPAQUE_POINTERS_INTERNAL) + CmdArgs.push_back(Args.MakeArgString("-plugin-opt=-opaque-pointers")); + // If an explicit debugger tuning argument appeared, pass it along. if (Arg *A = Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits