Skip to content

Commit

Permalink
[AutoUpgrade] Add flag to disable autoupgrading debug info
Browse files Browse the repository at this point in the history
Auto-upgrade can be expensive, especially UpgradeDebugInfo() since it runs the verifier.

With this patch, we can specify that the imported bitcode is built with the same revision of LLVM, meaning there's no need to run any auto-upgrading. For now, limit this to just debug info since projects like Rust want to support multiple versions of LLVM at the same time (at compiler build time, not at Rust source code build time) and run a subset of the autoupgrade functionality for simplicity.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D143229
  • Loading branch information
aeubanks committed Mar 14, 2023
1 parent cb743dd commit a4d3bc6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
10 changes: 9 additions & 1 deletion llvm/lib/IR/AutoUpgrade.cpp
Expand Up @@ -32,12 +32,18 @@
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Regex.h"
#include "llvm/TargetParser/Triple.h"
#include <cstring>

using namespace llvm;

static cl::opt<bool>
DisableAutoUpgradeDebugInfo("disable-auto-upgrade-debug-info",
cl::desc("Disable autoupgrade of debug info"));

static void rename(GlobalValue *GV) { GV->setName(GV->getName() + ".old"); }

// Upgrade the declarations of the SSE4.1 ptest intrinsics whose arguments have
Expand Down Expand Up @@ -4480,6 +4486,9 @@ Constant *llvm::UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy) {
/// Check the debug info version number, if it is out-dated, drop the debug
/// info. Return true if module is modified.
bool llvm::UpgradeDebugInfo(Module &M) {
if (DisableAutoUpgradeDebugInfo)
return false;

unsigned Version = getDebugMetadataVersionFromModule(M);
if (Version == DEBUG_METADATA_VERSION) {
bool BrokenDebugInfo = false;
Expand Down Expand Up @@ -4988,7 +4997,6 @@ void llvm::UpgradeAttributes(AttrBuilder &B) {
}

void llvm::UpgradeOperandBundles(std::vector<OperandBundleDef> &Bundles) {

// clang.arc.attachedcall bundles are now required to have an operand.
// If they don't, it's okay to drop them entirely: when there is an operand,
// the "attachedcall" is meaningful and required, but without an operand,
Expand Down
8 changes: 8 additions & 0 deletions llvm/test/LTO/X86/strip-debug-info.ll
Expand Up @@ -24,10 +24,18 @@
; RUN: -exported-symbol foo -exported-symbol _foo \
; RUN: %t-stripped.bc -disable-verify 2>&1 | \
; RUN: FileCheck %s -allow-empty -check-prefix=CHECK-WARN
; ---- Thin LTO (optimize, don't strip imported file)
; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t-stripped.bc %t2.bc
; RUN: llvm-lto -thinlto -thinlto-action=import -disable-auto-upgrade-debug-info \
; RUN: -thinlto-index=%t.index.bc \
; RUN: -exported-symbol foo -exported-symbol _foo \
; RUN: %t-stripped.bc -disable-verify 2>&1 | \
; RUN: FileCheck %s -allow-empty -check-prefix=CHECK-NO-WARN

; CHECK-WARN: warning{{.*}} ignoring invalid debug info
; CHECK-WARN-NOT: Broken module found
; CHECK: foo
; CHECK-NO-WARN-NOT: ignoring invalid debug info
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.12"

Expand Down

0 comments on commit a4d3bc6

Please sign in to comment.