Index: include/clang/Basic/CodeGenOptions.def =================================================================== --- include/clang/Basic/CodeGenOptions.def +++ include/clang/Basic/CodeGenOptions.def @@ -356,6 +356,9 @@ /// Whether to emit an address-significance table into the object file. CODEGENOPT(Addrsig, 1, 0) +/// Whether to convert a switch table into a bitmap or not. +CODEGENOPT(NoSwitchBitmap, 1, 0) + ENUM_CODEGENOPT(SignReturnAddress, SignReturnAddressScope, 2, None) ENUM_CODEGENOPT(SignReturnAddressKey, SignReturnAddressKeyValue, 1, AKey) CODEGENOPT(BranchTargetEnforcement, 1, 0) Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -774,6 +774,10 @@ HelpText<"Emit an address-significance table">; def fno_addrsig : Flag<["-"], "fno-addrsig">, Group, Flags<[CoreOption]>, HelpText<"Don't emit an address-significance table">; +def fswitch_bitmap : Flag<["-"], "fswitch-bitmap">, Group, + Flags<[CC1Option]>, HelpText<"Convert switch to bitmap">; +def fno_switch_bitmap : Flag<["-"], "fno-switch-bitmap">, Group, + Flags<[CoreOption, CC1Option]>, HelpText<"Do not convert switch to bitmap">; def fblocks : Flag<["-"], "fblocks">, Group, Flags<[CoreOption, CC1Option]>, HelpText<"Enable the 'blocks' language feature">; def fbootclasspath_EQ : Joined<["-"], "fbootclasspath=">, Group; Index: lib/CodeGen/BackendUtil.cpp =================================================================== --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -473,6 +473,7 @@ Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning(); Options.EmitStackSizeSection = CodeGenOpts.StackSizeSection; Options.EmitAddrsig = CodeGenOpts.Addrsig; + Options.EmitSwitchBitmap = CodeGenOpts.NoSwitchBitmap; if (CodeGenOpts.getSplitDwarfMode() != CodeGenOptions::NoFission) Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile; @@ -558,6 +559,7 @@ PMBuilder.PrepareForThinLTO = CodeGenOpts.PrepareForThinLTO; PMBuilder.PrepareForLTO = CodeGenOpts.PrepareForLTO; PMBuilder.RerollLoops = CodeGenOpts.RerollLoops; + PMBuilder.NoSwitchBitmap = CodeGenOpts.NoSwitchBitmap; MPM.add(new TargetLibraryInfoWrapperPass(*TLII)); Index: lib/Driver/ToolChains/Clang.cpp =================================================================== --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -5340,6 +5340,14 @@ TC.useIntegratedAs())) CmdArgs.push_back("-faddrsig"); + // If the target is Aarch64 and we are optimizing for size, we don't want to + // convert switch tables into bitmaps. + if (Args.hasFlag(options::OPT_fno_switch_bitmap, options::OPT_fswitch_bitmap, + (Triple.getArch() == llvm::Triple::aarch64)) && + getOptimizationLevelSize(Args)) { + CmdArgs.push_back("-fno-switch-bitmap"); + } + // Finally add the compile command to the compilation. if (Args.hasArg(options::OPT__SLASH_fallback) && Output.getType() == types::TY_Object && Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1284,6 +1284,8 @@ Opts.Addrsig = Args.hasArg(OPT_faddrsig); + Opts.NoSwitchBitmap = Args.hasArg(OPT_fno_switch_bitmap); + if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) { StringRef SignScope = A->getValue();