Index: llvm/trunk/lib/IR/Value.cpp =================================================================== --- llvm/trunk/lib/IR/Value.cpp +++ llvm/trunk/lib/IR/Value.cpp @@ -39,6 +39,10 @@ using namespace llvm; +static cl::opt NonGlobalValueMaxNameSize( + "non-global-value-max-name-size", cl::Hidden, cl::init(1024), + cl::desc("Maximum size for the name of non-global values.")); + //===----------------------------------------------------------------------===// // Value Class //===----------------------------------------------------------------------===// @@ -244,6 +248,11 @@ if (getName() == NameRef) return; + // Cap the size of non-GlobalValue names. + if (NameRef.size() > NonGlobalValueMaxNameSize && !isa(this)) + NameRef = + NameRef.substr(0, std::max(1u, (unsigned)NonGlobalValueMaxNameSize)); + assert(!getType()->isVoidTy() && "Cannot assign a name to void values!"); // Get the symbol table to update for this object. Index: llvm/trunk/test/Bitcode/value-with-long-name.ll =================================================================== --- llvm/trunk/test/Bitcode/value-with-long-name.ll +++ llvm/trunk/test/Bitcode/value-with-long-name.ll @@ -0,0 +1,18 @@ +; Check the size of generated variable when no option is set +; RUN: opt -S %s -O2 -o - | FileCheck -check-prefix=CHECK-LONG %s +; CHECK-LONG: %{{[a-z]{4}[a-z]+}} + +; Then check we correctly cap the size of newly generated non-global values name +; Force the size to be small so that the check works on release and debug build +; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=0 | FileCheck -check-prefix=CHECK-SHORT %s +; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=1 | FileCheck -check-prefix=CHECK-SHORT %s +; CHECK-SHORT-NOT: %{{[a-z][a-z]+}} + +define i32 @f(i32 %a, i32 %b) { + %c = add i32 %a, %b + %d = add i32 %c, %a + %e = add i32 %d, %b + ret i32 %e +} + +