[llvm-commits] [llvm] r62286 - in /llvm/trunk: include/llvm/CodeGen/DwarfWriter.h lib/CodeGen/AsmPrinter/DwarfWriter.cpp lib/CodeGen/SelectionDAG/FastISel.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp test/DebugInfo/2009-01-15-dbg_declare.ll

Devang Patel dpatel at apple.com
Fri Jan 16 10:10:32 PST 2009


On Jan 16, 2009, at 9:55 AM, Evan Cheng wrote:

> Hi Devang,
>
> Is this the right fix or just a work around? Should llvm-gcc be  
> generating these invalid declare intrinsics in the first place?

llvm-gcc should not generate invalid intrinsics, but lvm code  
generator does not control all tools that can generate llvm IR.
Version6 check is for backward compatibility.

> It seems like this will increase compile time. It could be  
> noticeable when it's in fastisel mode, no?

May be... will have to measure. BTW, MachineModule's debug info  
handler did this check. It is not new.

>
> +    DIDescriptor DI(GV);
> +    // Check current version. Allow Version6 for now.
> +    unsigned Version = DI.getVersion();
> +    if (Version != DIDescriptor::Version7 && Version !=  
> DIDescriptor::Version6)
> +      return false;
>
> I know DIDescriptor is light weight. But is it necessary to create  
> the descriptor just to check the version number? Can you add a  
> helper function to DebugInfo that examines GV and returns its  
> corresponding version?

yup. I intend to create two helper functions 1) to check version 2) to  
check tag.

>
> Also
> +    if (DW && SPI->getContext() && DW->ValidDebugInfo(SPI- 
> >getContext())) {
>
> You might as well fold the "SPI->getContext()" check into  
> ValidDebugInfo.

ok
-
Devang
>
> Evan
>
>
> On Jan 15, 2009, at 3:41 PM, Devang Patel wrote:
>
>> Author: dpatel
>> Date: Thu Jan 15 17:41:32 2009
>> New Revision: 62286
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=62286&view=rev
>> Log:
>>
>> Validate dbg_* intrinsics before lowering them.
>>
>>
>> Added:
>>    llvm/trunk/test/DebugInfo/2009-01-15-dbg_declare.ll
>> Modified:
>>    llvm/trunk/include/llvm/CodeGen/DwarfWriter.h
>>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
>>    llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
>>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
>>
>> Modified: llvm/trunk/include/llvm/CodeGen/DwarfWriter.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DwarfWriter.h?rev=62286&r1=62285&r2=62286&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/include/llvm/CodeGen/DwarfWriter.h (original)
>> +++ llvm/trunk/include/llvm/CodeGen/DwarfWriter.h Thu Jan 15  
>> 17:41:32 2009
>> @@ -29,6 +29,7 @@
>> class DwarfException;
>> class MachineModuleInfo;
>> class MachineFunction;
>> +class Value;
>> class Module;
>> class GlobalVariable;
>> class TargetAsmInfo;
>> @@ -75,6 +76,8 @@
>>   ///
>>   void EndFunction(MachineFunction *MF);
>>
>> +  /// ValidDebugInfo - Return true if V represents valid debug  
>> info value.
>> +  bool ValidDebugInfo(Value *V);
>>
>>   /// label. Returns a unique label ID used to generate a label and  
>> provide
>>   /// correspondence to the source line list.
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp?rev=62286&r1=62285&r2=62286&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp Thu Jan 15  
>> 17:41:32 2009
>> @@ -19,6 +19,7 @@
>> #include "llvm/ADT/UniqueVector.h"
>> #include "llvm/Module.h"
>> #include "llvm/DerivedTypes.h"
>> +#include "llvm/Constants.h"
>> #include "llvm/CodeGen/AsmPrinter.h"
>> #include "llvm/CodeGen/MachineModuleInfo.h"
>> #include "llvm/CodeGen/MachineFrameInfo.h"
>> @@ -100,6 +101,25 @@
>>     getGlobalVariablesUsing(UseRoot, Result);
>> }
>>
>> +/// getGlobalVariable - Return either a direct or cast Global value.
>> +///
>> +static GlobalVariable *getGlobalVariable(Value *V) {
>> +  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
>> +    return GV;
>> +  } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
>> +    if (CE->getOpcode() == Instruction::BitCast) {
>> +      return dyn_cast<GlobalVariable>(CE->getOperand(0));
>> +    } else if (CE->getOpcode() == Instruction::GetElementPtr) {
>> +      for (unsigned int i=1; i<CE->getNumOperands(); i++) {
>> +        if (!CE->getOperand(i)->isNullValue())
>> +          return NULL;
>> +      }
>> +      return dyn_cast<GlobalVariable>(CE->getOperand(0));
>> +    }
>> +  }
>> +  return NULL;
>> +}
>> +
>> // 
>> = 
>> = 
>> = 
>> ----------------------------------------------------------------------= 
>> ==//
>> /// DWLabel - Labels are used to track locations in the assembler  
>> file.
>> /// Labels appear in the form @verbatim <prefix><Tag><Number>  
>> @endverbatim,
>> @@ -3056,6 +3076,26 @@
>>
>> public:
>>
>> +  /// ValidDebugInfo - Return true if V represents valid debug  
>> info value.
>> +  bool ValidDebugInfo(Value *V) {
>> +    GlobalVariable *GV = getGlobalVariable(V);
>> +    if (!GV)
>> +      return false;
>> +
>> +    if (GV->getLinkage() != GlobalValue::InternalLinkage
>> +        && GV->getLinkage() != GlobalValue::LinkOnceLinkage)
>> +      return false;
>> +
>> +    DIDescriptor DI(GV);
>> +    // Check current version. Allow Version6 for now.
>> +    unsigned Version = DI.getVersion();
>> +    if (Version != DIDescriptor::Version7 && Version !=  
>> DIDescriptor::Version6)
>> +      return false;
>> +
>> +    //FIXME - Check individual descriptors.
>> +    return true;
>> +  }
>> +
>>   /// RecordSourceLine - Records location information and  
>> associates it with a
>>   /// label. Returns a unique label ID used to generate a label and  
>> provide
>>   /// correspondence to the source line list.
>> @@ -4221,6 +4261,11 @@
>>     MMI->EndFunction();
>> }
>>
>> +/// ValidDebugInfo - Return true if V represents valid debug info  
>> value.
>> +bool DwarfWriter::ValidDebugInfo(Value *V) {
>> +  return DD->ValidDebugInfo(V);
>> +}
>> +
>> /// RecordSourceLine - Records location information and associates  
>> it with a
>> /// label. Returns a unique label ID used to generate a label and  
>> provide
>> /// correspondence to the source line list.
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=62286&r1=62285&r2=62286&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Thu Jan 15  
>> 17:41:32 2009
>> @@ -317,7 +317,7 @@
>>   default: break;
>>   case Intrinsic::dbg_stoppoint: {
>>     DbgStopPointInst *SPI = cast<DbgStopPointInst>(I);
>> -    if (DW && SPI->getContext()) {
>> +    if (DW && SPI->getContext() && DW->ValidDebugInfo(SPI- 
>> >getContext())) {
>>       DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
>>       unsigned SrcFile = DW->RecordSource(CU.getDirectory(),
>>                                           CU.getFilename());
>> @@ -331,7 +331,7 @@
>>   }
>>   case Intrinsic::dbg_region_start: {
>>     DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I);
>> -    if (DW && RSI->getContext()) {
>> +    if (DW && RSI->getContext() && DW->ValidDebugInfo(RSI- 
>> >getContext())) {
>>       unsigned ID =
>>         DW->RecordRegionStart(cast<GlobalVariable>(RSI- 
>> >getContext()));
>>       const TargetInstrDesc &II =  
>> TII.get(TargetInstrInfo::DBG_LABEL);
>> @@ -341,7 +341,7 @@
>>   }
>>   case Intrinsic::dbg_region_end: {
>>     DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I);
>> -    if (DW && REI->getContext()) {
>> +    if (DW && REI->getContext() && DW->ValidDebugInfo(REI- 
>> >getContext())) {
>>       unsigned ID =
>>         DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext()));
>>       const TargetInstrDesc &II =  
>> TII.get(TargetInstrInfo::DBG_LABEL);
>> @@ -353,7 +353,7 @@
>>     if (!DW) return true;
>>     DbgFuncStartInst *FSI = cast<DbgFuncStartInst>(I);
>>     Value *SP = FSI->getSubprogram();
>> -    if (SP) {
>> +    if (SP && DW->ValidDebugInfo(SP)) {
>>       // llvm.dbg.func.start implicitly defines a dbg_stoppoint  
>> which is
>>       // what (most?) gdb expects.
>>       DISubprogram Subprogram(cast<GlobalVariable>(SP));
>> @@ -375,7 +375,7 @@
>>   case Intrinsic::dbg_declare: {
>>     DbgDeclareInst *DI = cast<DbgDeclareInst>(I);
>>     Value *Variable = DI->getVariable();
>> -    if (DW && Variable) {
>> +    if (DW && Variable && DW->ValidDebugInfo(Variable)) {
>>       // Determine the address of the declared object.
>>       Value *Address = DI->getAddress();
>>       if (BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=62286&r1=62285&r2=62286&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp  
>> (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Thu  
>> Jan 15 17:41:32 2009
>> @@ -3746,7 +3746,7 @@
>>   case Intrinsic::dbg_stoppoint: {
>>     DwarfWriter *DW = DAG.getDwarfWriter();
>>     DbgStopPointInst &SPI = cast<DbgStopPointInst>(I);
>> -    if (DW && SPI.getContext())
>> +    if (DW && SPI.getContext() && DW- 
>> >ValidDebugInfo(SPI.getContext()))
>>       DAG.setRoot(DAG.getDbgStopPoint(getRoot(),
>>                                       SPI.getLine(),
>>                                       SPI.getColumn(),
>> @@ -3756,7 +3756,7 @@
>>   case Intrinsic::dbg_region_start: {
>>     DwarfWriter *DW = DAG.getDwarfWriter();
>>     DbgRegionStartInst &RSI = cast<DbgRegionStartInst>(I);
>> -    if (DW && RSI.getContext()) {
>> +    if (DW && RSI.getContext() && DW- 
>> >ValidDebugInfo(RSI.getContext())) {
>>       unsigned LabelID =
>>         DW- 
>> >RecordRegionStart(cast<GlobalVariable>(RSI.getContext()));
>>       DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getRoot(), LabelID));
>> @@ -3767,7 +3767,7 @@
>>   case Intrinsic::dbg_region_end: {
>>     DwarfWriter *DW = DAG.getDwarfWriter();
>>     DbgRegionEndInst &REI = cast<DbgRegionEndInst>(I);
>> -    if (DW && REI.getContext()) {
>> +    if (DW && REI.getContext() && DW- 
>> >ValidDebugInfo(REI.getContext())) {
>>       unsigned LabelID =
>>         DW->RecordRegionEnd(cast<GlobalVariable>(REI.getContext()));
>>       DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getRoot(), LabelID));
>> @@ -3780,7 +3780,7 @@
>>     if (!DW) return 0;
>>     DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
>>     Value *SP = FSI.getSubprogram();
>> -    if (SP) {
>> +    if (SP && DW->ValidDebugInfo(SP)) {
>>       // llvm.dbg.func.start implicitly defines a dbg_stoppoint  
>> which is
>>       // what (most?) gdb expects.
>>       DISubprogram Subprogram(cast<GlobalVariable>(SP));
>> @@ -3802,7 +3802,7 @@
>>     DwarfWriter *DW = DAG.getDwarfWriter();
>>     DbgDeclareInst &DI = cast<DbgDeclareInst>(I);
>>     Value *Variable = DI.getVariable();
>> -    if (DW && Variable)
>> +    if (DW && Variable && DW->ValidDebugInfo(Variable))
>>       DAG.setRoot(DAG.getNode(ISD::DECLARE, MVT::Other, getRoot(),
>>                               getValue(DI.getAddress()),  
>> getValue(Variable)));
>>     return 0;
>>
>> Added: llvm/trunk/test/DebugInfo/2009-01-15-dbg_declare.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2009-01-15-dbg_declare.ll?rev=62286&view=auto
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/test/DebugInfo/2009-01-15-dbg_declare.ll (added)
>> +++ llvm/trunk/test/DebugInfo/2009-01-15-dbg_declare.ll Thu Jan 15  
>> 17:41:32 2009
>> @@ -0,0 +1,15 @@
>> +
>> +; RUN: llvm-as < %s | llc -f -o /dev/null
>> +target triple = "powerpc-apple-darwin9.5"
>> +        %llvm.dbg.variable.type = type { i32, { }*, i8*, { }*,  
>> i32, { }*, i8*, i8* }
>> + at llvm.dbg.variable24 = external constant  
>> %llvm.dbg.variable.type                ; <%llvm.dbg.variable.type*>  
>> [#uses=1]
>> +
>> +declare void @llvm.dbg.declare({ }*, { }*) nounwind
>> +
>> +define i32 @isascii(i32 %_c) nounwind {
>> +entry:
>> +        call void @llvm.dbg.declare({ }* null, { }* bitcast  
>> (%llvm.dbg.variable.type* @llvm.dbg.variable24 to { }*))
>> +        unreachable
>> +}
>> +
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-
Devang



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090116/3f2ba7ba/attachment.html>


More information about the llvm-commits mailing list