mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-19 05:16:53 +00:00

Currently when `--icf=safe_thunks` is used, `STABS` entries cannot be generated for ICF'ed functions. This is because if ICF converts a full function into a thunk and then we generate a `STABS` entry for the thunk, `dsymutil` will expect to find the entire function body at the location of the thunk. Because just a thunk will be present at the location of the `STABS` entry - dsymutil will generate invalid debug info for such scenarios. With this change, if `--icf=safe_thunks` is used and `--keep-icf-stabs` is also specified, STABS entries will be created for all functions, even merged ones. However, the STABS entries will point at the actual (full) function body while having the name of the thunk. This way we still get program correctness as well as correct DWARF data. When doing this, the debug data will be identical to the scenario where we're using `--icf=all` and `--keep-icf-stabs`, but the actual program will also contain thunks, which won't show up in the DWARF data.
32 lines
967 B
C++
32 lines
967 B
C++
//===- ICF.h ----------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLD_MACHO_ICF_H
|
|
#define LLD_MACHO_ICF_H
|
|
|
|
#include "InputFiles.h"
|
|
#include "lld/Common/LLVM.h"
|
|
#include <vector>
|
|
|
|
namespace lld::macho {
|
|
class Symbol;
|
|
class Defined;
|
|
|
|
void markAddrSigSymbols();
|
|
void markSymAsAddrSig(Symbol *s);
|
|
void foldIdenticalSections(bool onlyCfStrings);
|
|
|
|
// Given a symbol that was folded into a thunk, return the symbol pointing to
|
|
// the actual body of the function. We expose this function to allow getting the
|
|
// main function body for a symbol that was folded via a thunk.
|
|
Defined *getBodyForThunkFoldedSym(Defined *foldedSym);
|
|
|
|
} // namespace lld::macho
|
|
|
|
#endif
|