| Index: build/config/compiler/BUILD.gn | 
| diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn | 
| index e7af924c4dc5703a2ea49ce18f1444b829262161..8e8a0e7f054009ed89bd6cdc31e2176d89033596 100644 | 
| --- a/build/config/compiler/BUILD.gn | 
| +++ b/build/config/compiler/BUILD.gn | 
| @@ -199,9 +199,9 @@ config("compiler") { | 
| ldflags += [ "-Wl,--fatal-warnings" ] | 
| } | 
|  | 
| -    # Common options for AddressSanitizer, LeakSanitizer, ThreadSanitizer and | 
| -    # MemorySanitizer | 
| -    if (using_sanitizer) { | 
| +    # Common options for AddressSanitizer, LeakSanitizer, ThreadSanitizer, | 
| +    # MemorySanitizer and non-official CFI builds. | 
| +    if (using_sanitizer || (is_cfi && !is_official_build)) { | 
| cflags += [ | 
| "-fno-omit-frame-pointer", | 
| "-gline-tables-only", | 
| @@ -239,6 +239,57 @@ config("compiler") { | 
| "-fsanitize-blacklist=$msan_blacklist_path", | 
| ] | 
| } | 
| +    if (is_cfi && !is_nacl) { | 
| +      cfi_blacklist_path = | 
| +          rebase_path("//tools/cfi/blacklist.txt", root_build_dir) | 
| +      cflags += [ | 
| +        "-flto", | 
| +        "-fsanitize=cfi-vcall", | 
| +        "-fsanitize=cfi-derived-cast", | 
| +        "-fsanitize=cfi-unrelated-cast", | 
| +        "-fsanitize-blacklist=$cfi_blacklist_path", | 
| +      ] | 
| +      ldflags += [ | 
| +        "-flto", | 
| +        "-fsanitize=cfi-vcall", | 
| +        "-fsanitize=cfi-derived-cast", | 
| +        "-fsanitize=cfi-unrelated-cast", | 
| +      ] | 
| + | 
| +      # Apply a lower LTO optimization level in non-official builds. | 
| +      if (!is_official_build) { | 
| +        if (is_linux) { | 
| +          ldflags += [ "-Wl,-plugin-opt,O1" ] | 
| +        } else if (is_mac) { | 
| +          ldflags += [ "-Wl,-mllvm,-O1" ] | 
| +        } | 
| +      } | 
| + | 
| +      # Work-around for http://openradar.appspot.com/20356002 | 
| +      if (is_mac) { | 
| +        ldflags += [ "-Wl,-all_load" ] | 
| +      } | 
| + | 
| +      # Without this flag, LTO produces a .text section that is larger | 
| +      # than the maximum call displacement, preventing the linker from | 
| +      # relocating calls (http://llvm.org/PR22999). | 
| +      if (current_cpu == "arm") { | 
| +        ldflags += [ "-Wl,-plugin-opt,-function-sections" ] | 
| +      } | 
| + | 
| +      if (use_cfi_diag) { | 
| +        cflags += [ | 
| +          "-fno-sanitize-trap=cfi", | 
| +          "-fsanitize-recover=cfi", | 
| +        ] | 
| +        ldflags += [ | 
| +          "-fno-sanitize-trap=cfi", | 
| +          "-fsanitize-recover=cfi", | 
| +        ] | 
| +      } else { | 
| +        defines += [ "CFI_ENFORCEMENT" ] | 
| +      } | 
| +    } | 
|  | 
| if (use_custom_libcxx) { | 
| cflags_cc += [ "-nostdinc++" ] | 
| @@ -466,7 +517,7 @@ config("compiler") { | 
| "-Wl,-z,now", | 
| "-Wl,-z,relro", | 
| ] | 
| -    if (!using_sanitizer) { | 
| +    if (!using_sanitizer && !use_cfi_diag) { | 
| ldflags += [ "-Wl,-z,defs" ] | 
| } | 
| } | 
| @@ -1099,11 +1150,14 @@ config("rtti") { | 
| } | 
| } | 
| config("no_rtti") { | 
| -  if (is_win) { | 
| -    cflags_cc = [ "/GR-" ] | 
| -  } else { | 
| -    cflags_cc = [ "-fno-rtti" ] | 
| -    cflags_objcc = cflags_cc | 
| +  # CFI diagnostics require RTTI. | 
| +  if (!use_cfi_diag) { | 
| +    if (is_win) { | 
| +      cflags_cc = [ "/GR-" ] | 
| +    } else { | 
| +      cflags_cc = [ "-fno-rtti" ] | 
| +      cflags_objcc = cflags_cc | 
| +    } | 
| } | 
| } | 
|  | 
|  |