tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

llvmorg-19-init-7654-gc23135c5488f.patch (6198B)


      1 From 7db340bcc57fb7f4fabbae34b30065fbd77b0174 Mon Sep 17 00:00:00 2001
      2 From: Leonard Grey <lgrey@chromium.org>
      3 Date: Mon, 8 Apr 2024 16:05:52 -0400
      4 Subject: [PATCH] -fsanitize=function: fix .subsections_via_symbols (#87527)
      5 
      6 -fsanitize=function emits a signature and function hash before a
      7 function. Similar to 7f6e2c9, these can be sheared off when
      8 `.subsections_via_symbols` is used.
      9 
     10 This change uses the same technique 7f6e2c9 introduced for prefixes:
     11 emitting a symbol for the metadata, then marking the actual function
     12 entry as an .alt_entry symbol.
     13 ---
     14 llvm/include/llvm/CodeGen/AsmPrinter.h      |  3 ++
     15 llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp  | 43 ++++++++++++---------
     16 llvm/test/CodeGen/AArch64/func-sanitizer.ll |  9 +++++
     17 llvm/test/CodeGen/X86/func-sanitizer.ll     | 10 +++++
     18 4 files changed, 46 insertions(+), 19 deletions(-)
     19 
     20 diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
     21 index 0ac497c5f8ef..96e302859f44 100644
     22 --- a/llvm/include/llvm/CodeGen/AsmPrinter.h
     23 +++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
     24 @@ -840,6 +840,9 @@ private:
     25   /// This method emits a comment next to header for the current function.
     26   virtual void emitFunctionHeaderComment();
     27 
     28 +  /// This method emits prefix-like data before the current function.
     29 +  void emitFunctionPrefix(ArrayRef<const Constant *> Prefix);
     30 +
     31   /// Emit a blob of inline asm to the output streamer.
     32   void
     33   emitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
     34 diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
     35 index 5381dfdd184c..a1d4c72d2899 100644
     36 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
     37 +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
     38 @@ -896,6 +896,27 @@ void AsmPrinter::emitDebugValue(const MCExpr *Value, unsigned Size) const {
     39 
     40 void AsmPrinter::emitFunctionHeaderComment() {}
     41 
     42 +void AsmPrinter::emitFunctionPrefix(ArrayRef<const Constant *> Prefix) {
     43 +  const Function &F = MF->getFunction();
     44 +  if (!MAI->hasSubsectionsViaSymbols()) {
     45 +    for (auto &C : Prefix)
     46 +      emitGlobalConstant(F.getParent()->getDataLayout(), C);
     47 +    return;
     48 +  }
     49 +  // Preserving prefix-like data on platforms which use subsections-via-symbols
     50 +  // is a bit tricky. Here we introduce a symbol for the prefix-like data
     51 +  // and use the .alt_entry attribute to mark the function's real entry point
     52 +  // as an alternative entry point to the symbol that precedes the function..
     53 +  OutStreamer->emitLabel(OutContext.createLinkerPrivateTempSymbol());
     54 +
     55 +  for (auto &C : Prefix) {
     56 +    emitGlobalConstant(F.getParent()->getDataLayout(), C);
     57 +  }
     58 +
     59 +  // Emit an .alt_entry directive for the actual function symbol.
     60 +  OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
     61 +}
     62 +
     63 /// EmitFunctionHeader - This method emits the header for the current
     64 /// function.
     65 void AsmPrinter::emitFunctionHeader() {
     66 @@ -935,23 +956,8 @@ void AsmPrinter::emitFunctionHeader() {
     67     OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_Cold);
     68 
     69   // Emit the prefix data.
     70 -  if (F.hasPrefixData()) {
     71 -    if (MAI->hasSubsectionsViaSymbols()) {
     72 -      // Preserving prefix data on platforms which use subsections-via-symbols
     73 -      // is a bit tricky. Here we introduce a symbol for the prefix data
     74 -      // and use the .alt_entry attribute to mark the function's real entry point
     75 -      // as an alternative entry point to the prefix-data symbol.
     76 -      MCSymbol *PrefixSym = OutContext.createLinkerPrivateTempSymbol();
     77 -      OutStreamer->emitLabel(PrefixSym);
     78 -
     79 -      emitGlobalConstant(F.getParent()->getDataLayout(), F.getPrefixData());
     80 -
     81 -      // Emit an .alt_entry directive for the actual function symbol.
     82 -      OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
     83 -    } else {
     84 -      emitGlobalConstant(F.getParent()->getDataLayout(), F.getPrefixData());
     85 -    }
     86 -  }
     87 +  if (F.hasPrefixData())
     88 +    emitFunctionPrefix({F.getPrefixData()});
     89 
     90   // Emit KCFI type information before patchable-function-prefix nops.
     91   emitKCFITypeId(*MF);
     92 @@ -983,8 +989,7 @@ void AsmPrinter::emitFunctionHeader() {
     93 
     94     auto *PrologueSig = mdconst::extract<Constant>(MD->getOperand(0));
     95     auto *TypeHash = mdconst::extract<Constant>(MD->getOperand(1));
     96 -    emitGlobalConstant(F.getParent()->getDataLayout(), PrologueSig);
     97 -    emitGlobalConstant(F.getParent()->getDataLayout(), TypeHash);
     98 +    emitFunctionPrefix({PrologueSig, TypeHash});
     99   }
    100 
    101   if (isVerbose()) {
    102 diff --git a/llvm/test/CodeGen/AArch64/func-sanitizer.ll b/llvm/test/CodeGen/AArch64/func-sanitizer.ll
    103 index 89f23e7ed80e..de83d70a5784 100644
    104 --- a/llvm/test/CodeGen/AArch64/func-sanitizer.ll
    105 +++ b/llvm/test/CodeGen/AArch64/func-sanitizer.ll
    106 @@ -1,4 +1,5 @@
    107 ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
    108 +; RUN: llc -mtriple=arm64-apple-darwin < %s | FileCheck %s --check-prefix=MACHO
    109 
    110 ; CHECK-LABEL: .type _Z3funv,@function
    111 ; CHECK-NEXT:    .word   3238382334  // 0xc105cafe
    112 @@ -7,6 +8,14 @@
    113 ; CHECK-NEXT:  // %bb.0:
    114 ; CHECK-NEXT:    ret
    115 
    116 +; MACHO:      ltmp0:
    117 +; MACHO-NEXT:   .long 3238382334 ; 0xc105cafe
    118 +; MACHO-NEXT:   .long 42 ; 0x2a
    119 +; MACHO-NEXT:   .alt_entry __Z3funv
    120 +; MACHO-NEXT:   __Z3funv:
    121 +; MACHO-NEXT:   ; %bb.0:
    122 +; MACHO-NEXT:   ret
    123 +
    124 define dso_local void @_Z3funv() nounwind !func_sanitize !0 {
    125   ret void
    126 }
    127 diff --git a/llvm/test/CodeGen/X86/func-sanitizer.ll b/llvm/test/CodeGen/X86/func-sanitizer.ll
    128 index b421cb53ddfe..71f062ae2f8c 100644
    129 --- a/llvm/test/CodeGen/X86/func-sanitizer.ll
    130 +++ b/llvm/test/CodeGen/X86/func-sanitizer.ll
    131 @@ -1,4 +1,5 @@
    132 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
    133 +; RUN: llc -mtriple=x86_64-apple-darwin < %s | FileCheck %s --check-prefix=MACHO
    134 
    135 ; CHECK:      .type _Z3funv,@function
    136 ; CHECK-NEXT:   .long   3238382334  # 0xc105cafe
    137 @@ -8,6 +9,15 @@
    138 ; CHECK-NEXT:   # %bb.0:
    139 ; CHECK-NEXT:   retq
    140 
    141 +; MACHO:      ltmp0:
    142 +; MACHO-NEXT:  .long 3238382334 ## 0xc105cafe
    143 +; MACHO-NEXT:  .long 42 ## 0x2a
    144 +; MACHO-NEXT:  .alt_entry __Z3funv
    145 +; MACHO-NEXT: __Z3funv:
    146 +; MACHO-NEXT:  .cfi_startproc
    147 +; MACHO-NEXT:  # %bb.0:
    148 +; MACHO-NEXT:  retq
    149 +
    150 define dso_local void @_Z3funv() !func_sanitize !0 {
    151   ret void
    152 }
    153 -- 
    154 2.44.0.1.g9765aa7075