From 8adae0c9406461dc078700ce1630832bda81f48f Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Wed, 28 Sep 2011 04:08:02 +0000 Subject: [PATCH] PTX: Pass param name strings per const reference. The copies caused use-after-free bugs on std::string implementations without COW (i.e. anything but libstdc++) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140679 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PTX/PTXISelLowering.cpp | 8 ++++---- lib/Target/PTX/PTXParamManager.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/Target/PTX/PTXISelLowering.cpp b/lib/Target/PTX/PTXISelLowering.cpp index 7333e99cec2..44733ac4910 100644 --- a/lib/Target/PTX/PTXISelLowering.cpp +++ b/lib/Target/PTX/PTXISelLowering.cpp @@ -225,7 +225,7 @@ SDValue PTXTargetLowering:: unsigned ParamSize = Ins[i].VT.getStoreSizeInBits(); unsigned Param = PM.addArgumentParam(ParamSize); - std::string ParamName = PM.getParamName(Param); + const std::string &ParamName = PM.getParamName(Param); SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(), MVT::Other); SDValue ArgValue = DAG.getNode(PTXISD::LOAD_PARAM, dl, Ins[i].VT, Chain, @@ -322,7 +322,7 @@ SDValue PTXTargetLowering:: if (Outs.size() == 1) { unsigned ParamSize = OutVals[0].getValueType().getSizeInBits(); unsigned Param = PM.addReturnParam(ParamSize); - std::string ParamName = PM.getParamName(Param); + const std::string &ParamName = PM.getParamName(Param); SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(), MVT::Other); Chain = DAG.getNode(PTXISD::STORE_PARAM, dl, MVT::Other, Chain, @@ -419,7 +419,7 @@ PTXTargetLowering::LowerCall(SDValue Chain, SDValue Callee, for (unsigned i = 0; i != OutVals.size(); ++i) { unsigned Size = OutVals[i].getValueType().getSizeInBits(); unsigned Param = PM.addLocalParam(Size); - std::string ParamName = PM.getParamName(Param); + const std::string &ParamName = PM.getParamName(Param); SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(), MVT::Other); Chain = DAG.getNode(PTXISD::STORE_PARAM, dl, MVT::Other, Chain, @@ -433,7 +433,7 @@ PTXTargetLowering::LowerCall(SDValue Chain, SDValue Callee, for (unsigned i = 0; i < Ins.size(); ++i) { unsigned Size = Ins[i].VT.getStoreSizeInBits(); unsigned Param = PM.addLocalParam(Size); - std::string ParamName = PM.getParamName(Param); + const std::string &ParamName = PM.getParamName(Param); SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(), MVT::Other); Ops[i+1] = ParamValue; diff --git a/lib/Target/PTX/PTXParamManager.h b/lib/Target/PTX/PTXParamManager.h index 1a18c74f98c..9fd2de52f7f 100644 --- a/lib/Target/PTX/PTXParamManager.h +++ b/lib/Target/PTX/PTXParamManager.h @@ -67,15 +67,15 @@ public: unsigned addLocalParam(unsigned Size); /// getParamName - Returns the name of the parameter as a string. - std::string getParamName(unsigned Param) const { + const std::string &getParamName(unsigned Param) const { assert(AllParams.count(Param) == 1 && "Param has not been defined!"); - return AllParams.lookup(Param).Name; + return AllParams.find(Param)->second.Name; } /// getParamSize - Returns the size of the parameter in bits. unsigned getParamSize(unsigned Param) const { assert(AllParams.count(Param) == 1 && "Param has not been defined!"); - return AllParams.lookup(Param).Size; + return AllParams.find(Param)->second.Size; } };