PTX: Pass param name strings per const reference.
authorBenjamin Kramer <benny.kra@googlemail.com>
Wed, 28 Sep 2011 04:08:02 +0000 (04:08 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Wed, 28 Sep 2011 04:08:02 +0000 (04:08 +0000)
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
lib/Target/PTX/PTXParamManager.h

index 7333e99cec242dc07ca93c1c8092d6ab97c389f0..44733ac4910fd2a65806876d1e1eded9ae93211a 100644 (file)
@@ -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;
index 1a18c74f98c14feccf8eabc678e520823d93b6f6..9fd2de52f7f249db5cfac98413100f2af9e9b6c6 100644 (file)
@@ -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;
   }
 
 };