summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2019-09-18 22:38:56 +0000
committerAdrian Prantl <aprantl@apple.com>2019-09-18 22:38:56 +0000
commit0779dffbd4a927d7bf9523482481248c51796907 (patch)
tree4f81626eff057e781360752c5a50bde2068a5b5c /llvm/lib
parent69a92352022338417f27bfa45c0471beb6a92cc7 (diff)
downloadbcm5719-llvm-0779dffbd4a927d7bf9523482481248c51796907.tar.gz
bcm5719-llvm-0779dffbd4a927d7bf9523482481248c51796907.zip
Remove the obsolete BlockByRefStruct flag from LLVM IR
DIFlagBlockByRefStruct is an unused DIFlag that originally was used by clang to express (Objective-)C block captures in debug info. For the last year Clang has been emitting complex DIExpressions to describe block captures instead, which makes all the code supporting this flag redundant. This patch removes the flag and all supporting "dead" code, so we can reuse the bit for something else in the future. Since this only affects debug info generated by Clang with the block extension this mostly affects Apple platforms and I don't have any bitcode compatibility concerns for removing this. The Verifier will reject debug info that uses the bit and thus degrade gracefully when LTO'ing older bitcode with a newer compiler. rdar://problem/44304813 Differential Revision: https://reviews.llvm.org/D67453 llvm-svn: 372272
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp8
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp48
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h1
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h9
-rw-r--r--llvm/lib/IR/Verifier.cpp8
5 files changed, 4 insertions, 70 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index f859a02033b..edc8cefa3e2 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -1165,16 +1165,8 @@ void DwarfCompileUnit::addGlobalTypeUnitType(const DIType *Ty,
GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie()));
}
-/// addVariableAddress - Add DW_AT_location attribute for a
-/// DbgVariable based on provided MachineLocation.
void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
MachineLocation Location) {
- // addBlockByrefAddress is obsolete and will be removed soon.
- // The clang frontend always generates block byref variables with a
- // complex expression that encodes exactly what addBlockByrefAddress
- // would do.
- assert((!DV.isBlockByrefVariable() || DV.hasComplexAddress()) &&
- "block byref variable without a complex expression");
if (DV.hasComplexAddress())
addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
else
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 9be64c42f0c..255203740ac 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -198,54 +198,8 @@ bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI,
return false;
}
-bool DbgVariable::isBlockByrefVariable() const {
- assert(getVariable() && "Invalid complex DbgVariable!");
- return getVariable()->getType()->isBlockByrefStruct();
-}
-
const DIType *DbgVariable::getType() const {
- DIType *Ty = getVariable()->getType();
- // FIXME: isBlockByrefVariable should be reformulated in terms of complex
- // addresses instead.
- if (Ty->isBlockByrefStruct()) {
- /* Byref variables, in Blocks, are declared by the programmer as
- "SomeType VarName;", but the compiler creates a
- __Block_byref_x_VarName struct, and gives the variable VarName
- either the struct, or a pointer to the struct, as its type. This
- is necessary for various behind-the-scenes things the compiler
- needs to do with by-reference variables in blocks.
-
- However, as far as the original *programmer* is concerned, the
- variable should still have type 'SomeType', as originally declared.
-
- The following function dives into the __Block_byref_x_VarName
- struct to find the original type of the variable. This will be
- passed back to the code generating the type for the Debug
- Information Entry for the variable 'VarName'. 'VarName' will then
- have the original type 'SomeType' in its debug information.
-
- The original type 'SomeType' will be the type of the field named
- 'VarName' inside the __Block_byref_x_VarName struct.
-
- NOTE: In order for this to not completely fail on the debugger
- side, the Debug Information Entry for the variable VarName needs to
- have a DW_AT_location that tells the debugger how to unwind through
- the pointers and __Block_byref_x_VarName struct to find the actual
- value of the variable. The function addBlockByrefType does this. */
- DIType *subType = Ty;
- uint16_t tag = Ty->getTag();
-
- if (tag == dwarf::DW_TAG_pointer_type)
- subType = cast<DIDerivedType>(Ty)->getBaseType();
-
- auto Elements = cast<DICompositeType>(subType)->getElements();
- for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
- auto *DT = cast<DIDerivedType>(Elements[i]);
- if (getName() == DT->getName())
- return DT->getBaseType();
- }
- }
- return Ty;
+ return getVariable()->getType();
}
/// Get .debug_loc entry for the instruction range starting at MI.
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
index 843caf1ab18..c8c511f67c2 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -216,7 +216,6 @@ public:
return !FrameIndexExprs.empty();
}
- bool isBlockByrefVariable() const;
const DIType *getType() const;
static bool classof(const DbgEntity *N) {
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
index a376d5e75f6..a188002722d 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
@@ -216,15 +216,6 @@ public:
/// Add thrown types.
void addThrownTypes(DIE &Die, DINodeArray ThrownTypes);
- // FIXME: Should be reformulated in terms of addComplexAddress.
- /// Start with the address based on the location provided, and generate the
- /// DWARF information necessary to find the actual Block variable (navigating
- /// the Block struct) based on the starting location. Add the DWARF
- /// information to the die. Obsolete, please use addComplexAddress instead.
- void addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
- dwarf::Attribute Attribute,
- const MachineLocation &Location);
-
/// Add a new type attribute to the specified entity.
///
/// This takes and attribute parameter because DW_AT_friend attributes are
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 18bd74baf17..ebd4125f184 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -982,6 +982,9 @@ void Verifier::visitDICompositeType(const DICompositeType &N) {
N.getRawVTableHolder());
AssertDI(!hasConflictingReferenceFlags(N.getFlags()),
"invalid reference flags", &N);
+ unsigned DIBlockByRefStruct = 1 << 4;
+ AssertDI((N.getFlags() & DIBlockByRefStruct) == 0,
+ "DIBlockByRefStruct on DICompositeType is no longer supported", &N);
if (N.isVector()) {
const DINodeArray Elements = N.getElements();
@@ -4902,11 +4905,6 @@ void Verifier::visitDbgIntrinsic(StringRef Kind, DbgVariableIntrinsic &DII) {
// This check is redundant with one in visitLocalVariable().
AssertDI(isType(Var->getRawType()), "invalid type ref", Var,
Var->getRawType());
- if (auto *Type = dyn_cast_or_null<DIType>(Var->getRawType()))
- if (Type->isBlockByrefStruct())
- AssertDI(DII.getExpression() && DII.getExpression()->getNumElements(),
- "BlockByRef variable without complex expression", Var, &DII);
-
verifyFnArgs(DII);
}
OpenPOWER on IntegriCloud